tech.guitarrapc.cóm

Technical updates

2019年を振り返って

毎年やっている昨年の振り返りをしてみます。

2018年はこれ。

tech.guitarrapc.com

目次

総合

2019年の初めにこう書きました。

会社としては、2019年は作りたいサービスを形にして何本かリリースするため働き方をシフトします。*8 個人は、会社のサービスリリースと収益化です。注力する言語的にはC# / Golang 、ツールはTerraform + Kubernetes + GCP/AWS/Azure + Unityです。

2019年は2018年より、さらに(自他に)求められるレベルが高くなっており、天井知らずを感じつつ楽しみたいと思います。

2019年は想定に基づいて働き方をシフトを進めました。 が、想定よりもクライアントとの密着した動きが必要になってしまって、結果そっちにフルコミットしていました。 つまり、サービスリリースのための余力0でそっちに全振り。 個人の目標からは乖離しておりよくない、けど経営計画で予想していた結果の一つで、途中でこっちに振ったので納得はあります。

今年は夏から完全にサーバーサイドに振っていて、Kubernetes での構築に完全シフトでした。前半はHoloLens、Vue.js に携わっていました。 サーバーサイド/インフラは、C#/Kunernetes が主で、おもにAWSがほとんどでした。2018年とは全然違う動きになったのですが、私のスキルがそっち側に伸びているので、まぁそんなものかと。一年を通して幾つか感じましたが、Kubernetes むずかし、たのしいのでよしとします。

2019年は、わからないことへの挑戦がかなり多く、知ってることの応用はあまり利かず前提に過ぎない状況をよく感じました。 もともと挑戦が多いのですが、結構苦しんだ感覚があります。

経営

会社としては、OSS は1つだけです。 会社としてメンテするもの、というのを公開していく方針なので来年はもう少し増やしていきたいので、増やせるように努力しよう。 サービスは後は実装なので、粛々と書きます、考えます。

一年を過ぎたので、税、会計回りも一通りすぎました。 経理、会計が税理士先生のおかげで負荷小さいので、感謝しかないです。 引き続き法に則って粛々と進めたいところ。

弁護士先生とのやり取りを通して、弁護士って法に基づいてうまく振る舞う方なのだなというのは少し面白かったです。 公正ではなく、利益を追求する側の人間なのは、なるほどそういうものかという気づきがありました。

興味深かったのは、中小企業庁の動きでした。 消費税増税で、転嫁拒否に対する法律上問題ある行動の有無に関して調査票が来たのですが、素直にうれしかったです。 弊社のお客様にそういった動きはなくスムーズに移行したのですが、転嫁拒否に対する是正の姿勢を見せてもらえるのは、経営者としてはうれしいものがありました。

プログラミング

2019年は、C# がかなり多かったです。 また、Terraform を普遍的に広く使うことが多かったものの、後半ではPulumi の調査と投入をしていて、AWS CDK よりいい感触でした。 Pulumi dotnet Advent Calendar やってましたが、Pulumiの利用悪くない感じがあります。

Pulumi dotnet Advent Calendar 2019 - Qiita

GitHub コミットは、ほどほどにこんなものでしょう。GitHub じゃないコミットが見えないので、少なく感じますが。

f:id:guitarrapc_tech:20200102223239p:plain
2019年GitHub コミット

なんか CircleCI 対応や Docker イメージの公開が想像の倍以上行うことになって、ひたすら必要な部品を作っては組み立ててました。

CSharp

お仕事でやっていた HoloLens + Unity でのお仕事が一通り構築してリリースを迎えられたのはよかったです。

C# はUnityを除き .NET Core のみでした。後半は、 .NET Core 2.1/2.2 を .NET Core 3.0/3.1 に対応とかありましたが、幸いコンテナ化していたので何も問題なく進んでよかった。

Serverless から一番遠ざかった年だったかもしれない、というのもたいていのものを ECS Faraget/Kubernetes 側に振ったというのもあります。 デプロイ、監視を含めた全体の流れからすると、Serverless を選択しない選択が結構増えました。 自分の会社では選ぶんですが、お手伝い先では選ばないということが結構多かったです。

C# のビルドは、割り切った結果、あんまり頑張らない方向に倒してうまくいっています。 dotnet CLI 的には頑張りようが小さいので、そこで外から頑張るよりは頑張らないように済む方向に。 UWP から離れたというのが大きい気がしますが、.NET Framework で SDK Style の csproj をハンドルできることに気づいたのがよかったです。

シングルバイナリは来ました、案の定CI/CD、コンテナでいい感じでした。 ただ、リフレクションは結構鬼門でリフレクションするならランタイム込みでビルドしても動作環境にdotnet ランタイムは必要。 リフレクション、明らかに使う機会はちょくちょくあるけどアプリの動作環境的には年々厳しい制約になりつつある気がする。

あとシングルバイナリでも .NET Core のICU はめんどくさいです。Invaliantでない限りは .NET Core は ICU ライブラリに依存してグローバリゼーション対応しているので仕方ないのですが。 これは Microsoft Docs にも載っていますが、実際にコンテナ回りでの動作を組むときに思ったよりツライ。

.NET Core アプリケーション展開 - .NET Core | Microsoft Docs

C# なんか年々難しい度が上がってるので、がんばろ。

CircleCI で感じるんですけど、C# というか dotnet CLI の Linux での操作なんか面倒、というか癖強い。

Golang

書くより読むことが多かった。 一つ必要だったのを書き上げましたが、素直だなという側面と書きにくさも感じるのでもうしばらく慣れまで必要そう。

VSCodeで書いててつらかったので Goland 入れました。

自社の言語は Golang を選んでいます。 しばらく自分の言語は二軸になりそう。

PowerShell

クロスプラットフォームで動く PowerShell Core とは裏腹に、お手伝い先で書く機会はなるべく減らしほぼ0にしていました。 なるべく選択に入らないようにしていたというのもあります。 代わりに Bash、C#を多く選びました。(可能なところなら Golang を選択しました)

これはアプリケーションエンジニアが同じものを触るときに、いかに違和感すくなくするかを考慮した結果です。 正確に言うと、アプリケーションエンジニアというよりPowerShell に興味がない人が、です。 PowerShellで書くだけで、そこに触れたくないという意識が働くケースをこれまでも多く見ていたので、なるべくその意識を起こさせたくなかった。 案の上、予想していた状況に近づいているので、選択はずれてなかったように思います。

個人では書いていて、guitarrapc/ScoopPlaybook や guitarrapc/dotfiles-win/setup.ps1 で使っています。 dotfiles-win のセットアップは、guitarrapc/dotfiles/setup.sh で書いたBash の動作を PowerShell で忠実に再現したものなので、書いてて面白かったです。

PowerShell 実践ガイドブックは、おかげ様で第三版まで重版されました。 次の機会があれば、PowerShell 7対応かな。

海外のコミュニティを見ていても、PowerShellではないコミュニティを見ていても、PowerShell 7になってもWindowsがない環境で標準的に使われることは恐らくないのだろうと感じます。 Windows では標準的な位置づけでいいのですが。 素直に「組み込みにくい」のは最大のハードルであり続けるのでしょう。

ShellScript

思った通り多かった、多くしました。 macOS だけ挙動が違うコマンドがところどころ出てくるのがうざいのですが、シカタナイ? もう少しコマンドのシミュレート、変換がいい感じにできないかなぁと思いつつ、粛々と書いています。

インフラ

お手伝いはこれが多かった。 Kubernetes 回りを組んでいます、ECS ともちょくちょくバトルしていました。

ECS は Mutlti Target Group サポートが来てだいぶんよくなりました。 しかし Code Deploy がひたすらツライ、Code Pipeline もアレですが、Code Deploy やばい、使いたくない、頑張って使ったけど、Kubernetes にたおす過程で使わないようにした。

Kubernetes はClient APIに手を付けていますが、仕様の変更の影響受けやすくて、うーんという感じが。 幸せになる世界はまだ先な感じがすごいある。

Terraform

Terraform は一度組んでおけば、結構使いまわし聞くのでそこはよかったです。 特に Terraform Cloudが来て Atlantis も使わずいい感じで管理できるようになったので、よかったよかった。

0.12 はすぐに対応したのですが、なかなかはじめのバグり方が盛大でさすが HashiCorp、引き続き警戒が必要という感じがあります。 とはいえ、Terraform Cloud の動きを見ていても、0.12 の後半のアップデートを見ていても少しずつ期待する方向に向いてきた気配もあるのかな。

Pragmatic Terraform on AWS がいい本でした。いくつか気になる内容はあるものの、概ね同意。

Pulumi

Terraform 以外の選択肢としてみてた時にちょうど GA してたので、検証から投入までしました。

結論からいうと使える、けどその言語で書かれているからと言って読めても意味は読めないというのは間違いなくあります。 AWS に限らず、GCP やKubernetes でなんでこういうリソースが必要なのか、こういう組み方が必要なのかはコードで読めても、リソースの意味や制約を知らないとできないようにです。

C# は今年GA なので、別State 参照が来たらオススメしてもいいかなぁ。 Provider を複数持ってもいいけど、別State はほしいかな。 チームで使うには高いので、なんかそこがずっとハードルになりそう。

Terraform から移行もしたのですが、移行するかどうかは Pulumi で、その言語で書きたいかに強く依存しそうです。 言語のとっつきにくさが消えるのはめちゃめちゃいいので、価値はあります。

Pulumi、公式ページが最大のリファレンスで特に .NET に関しては全然いないので頑張るしかない。コミュニティの規模はかなり小さいですね。

Kubernetes

ECS との選択、Kubernetesでの運用を考えた時に、実際にKubernetesでいくぞにするためにずっとやってました(ます)。 小さいチームだからこそ選択するという選択をしたのですが、結果は2020年に出るので引き続き正面から取り組みます。(つまり2019年初とは逆の判断をした)

しかし分散は得意だけど、特定の一台への接続を制御しようとすると工夫を凝らす必要があるので、そこはまだ頑張るしかない感触。 Agones を今のコンセプトのまま、ほどほどにいい感じで使えるように組んでいます。

比較的 Helm よりも Kustomize に振っています。

Kubernetes 完全ガイドが本当に良書でよかったです。

記事

78本、久々にちょっとはかけました。 Pulumi dotnet Advent Calendar で盛った感はあります。

C# が意識して多めです。 お手伝い先ではザクザク書いているのですが、手を動かしつつなので記事にするほどまとめてないというのもあり結構ブログに書こうとまでならないのですね。 2020年も同程度を維持したいです。

ライフスタイル

徐々に改善が見えてきましたが道は長そう。

睡眠時間が年間平均3時間14分と4分伸びました。11月、12月は4時間と伸びているのでちょっとずつ調整しています。 6時間寝るとかなり快適なのは前々からわかっていても達成できていないのですが、少しずつ意識的に週の中頃などに8時間程度寝れないか試みています。

ランチは抜くと夕方ごろに集中力が持たなくなってきたので意識して食べるようにしています。 糖質は意識的に少し差し引きつつ、たんぱく質でおなかに入った感じがあるように。

「個人に依存することはエンジンがかかるのが遅い」課題はなかなか解消できてないものの、すぐにやらなくても予め開いておくと手を付けやすいので意識的にそうしています。 個人に依存しないことは、Google Calendar でこまめにスケジュールに組むことでうまく維持できているので、どうやら自分に興味がないっぽい。

集中って私は最も大事なことと考えています。 で、見直した結果、椅子に座っててツライと感じるシーンがあったので先日7年ぐらい使ってたエルゴヒューマンを、アーロンチェアリマスターに変えました。 椅子って結構影響あるんですね、アーロンチェアの座り心地があってて結構集中しやすくなった感じがあります。 座り心地がいいというか、座っててつらくない、しっかり前を向ける。

最近は考え方を短いスパンで変化させることを意識させるようにしています。 結果として、数日前と言ってることが全然違っていたりするのですが、それでもいいとみなすようになったのは少し変わったかもしれません。

ゲーム

たまにはゲームのことも。 2020年のFINAL FANTASY7 REMAKEを楽しみにしています。(振り切るのか、考慮するのかが一番の注目として)

スマホ

モンストが好きで結構ずっとやっているのですが、ドラクエウォークが出てからこっちにシフトしました。 全キャラ全職業のレベルが50を超えたので、55の旅をしていて二週目。 冒険者レベルも50になって、お出かけレベルしか残ってないのでそろそろ何かこないかな。

マリオカートは相変わらずの任天堂な施策で、結構興味深く週一ぐらいで開いてはプレイしています。 任天堂のゲーム設計、運営って素直にすごいと思います。

Nintendo Switch

今年は、Nintendo Switch の利用が多かったです。

ゼルダの伝説夢を見る島は、小さいころにやったゲームでしたがリメイクを楽しみにやりました。2Dをスイッチでどう再構築するかが楽しみで、実際すごかった。 案外覚えててサクッとクリアしてしまったのですが、ハードモードむずかしいのでよいですね。 ただコントローラーのボタン配置は、やはり厳しいものがあって、Yで攻撃はやめてほしい感じがあります。どうしてこうしたんだろう。

Blood Stained が出たのでやってて案の定面白かったです? バランスが相変わらず壊せるので、終盤に行くほど楽になってしまうのも含めてまぁいいのでは。 結局銃最強だった。(終盤しか使わない)

PS4

ドラクエ11をやり忘れていたのでクリアしました。ドラクエは新しいタイトルほど面白いのでいいですね。一番面白かった。

そういえば私はFF15 が好きなんですが、売り上げ、本数が最も少ないのはゲーム性がどんどん変わってて、プレイヤーが置き去りになってるのかもなぁとドラクエをしていて思いました。(ドラクエは根本が変わってない) 私は新しい体験が好きなので、方針に共感はするのですが。

新サクラ大戦は年末やっていたのですが、二の次なのでまだクリアしていません。3D になったのはいいとして、戦闘回りがただの無双になってて本当にこれでいいのか? という感じがあります。

DEATH STRANDING を次にやりたいけど、まずクリアしてから予定。

Steam

Cities: Skylines をちょこちょこやってました。 楽しいけど、やっぱりシムシティ系なので時間をそこまで費やせない(費やす選択をしない) ので、むずかしい。

2020年は?

C# + Golang + Kubernetes + Firebase あたりが注力ポイントです。 サービスリリースと収益化をがんばろう。働き方のシフトよりも頑張りポイントのシフトがよさそう。

分からないことたくさんで人生飽きないな。 できることを一つずつ増やしていきます。

Wi-Fiを Amplifi HD に移行した

最近やってよかったことの一つが、Wi-Fi を入れ替えたことでした。

何がどう変わったのか残しておきます。

目次

TL;DR

  • Amplifi HD、日本ではまだ出荷可能になったばかりですがいい感じでおもしろいし安定はしてる。
  • 外出先からアプリで設定変更したり通信テストできるのは人権
  • ミニスクリーンに現在の通信状況が可視化されるのは本当にいい、最高
  • タッチでWPSを有効にできたりするけど、WPS今どき機器がなくていらない感

Wi-Fi をどれぐらい使っているのか

100% Wi-Fiです。 唯一違うのは、Hue Hub と Yamaha RTX810 - Wi-Fi AP の間のみですが、ごく短距離の同一ボックス内LANで結んでいるので目に見えません。

有線を廃止してすでに5年経っています。 有線は高速でいいのですが、ケーブルをどこまでも減らしたいというのが強く、ネットワークからまずそれを前提にしています。 常にWi-Fiが稼働するので少しの問題でもすぐに気づいたり、手を打つ気になるので個人的な好みである「普段からドッグフーディンぐする」とよくマッチしています。

一方で常時Wi-Fiに問題になるのが、通信の安定性です。 最優先が安定性、速度となるのですが案外これが満たされません。 色々試した結果、3年前の時点では最終的に Aterm が安定していたのでこれを使ってきました。

デスクトップは、ASUS PCE-AC88 をつないで使っています。 Wi-Fi拡張カードは、Windows 10 の起動時やドライバー問題が多く Intel もなかなか厳しかったのですが、PCE-AC88は安定したドライバーと速度が両立していてとておmいいです。

PCE-AC88 | ネットワーク機器 | ASUS 日本

動機

さて、通信が安定していてよかったもののAtermは結構面白くないWi-Fiです。

  • 管理画面がWebのみ
  • Webの管理画面の変更の変更に都度時間がかかる + 再起動が毎度求められる
  • 同一ネットワークからのアクセスしかできない
  • 規格が古い

飽きたので変えましょう。

選定基準

以下を満たすものを探します。

  • 面白そうなやつ
  • アプリでの設定を前提にする
  • メッシュ対応
  • TP Link、Synology、ASUS は避けたい (尊敬するエンジニアがツライいってる....)
  • Buffalo は避けたい (良かったことがほぼない)

以下は不要とします。

  • Wi-Fi 6 (あればうれしいけど)
  • WPA3 対応
  • トライバンド
  • IPoE 対応 (ルータがあるのでそっちで対応する)

価格は Nest Wifi 基準で20000円前後で

候補の絞り込み

いい感じのメッシュルータの一覧はありますが、これだけだと選びようがないのでちらちら調べて絞ります。

日本で入手できるメッシュWi-Fiシステム19種+2の比較【2019年12月】 | 24Wireless

メーカーで絞りこみます。

  • Nest Wifi (Google)
  • Orbi (NetGear)
  • Velop (Belkin)
  • Sila (Razer)
  • Amplifi HD (Ubiquiti)

順にみていきます。

Nest Wifi

Nest Wifi - 高速で快適な Wi-Fi ネットワークをご自宅で - Google ストア

Google Wifi よりは面白そう。 見た目はつまらないけど、ほしい機能は一通りあるしまぁよさそう。 ただ、Google のアプリ微妙で好きじゃないので、「最悪これ」という位置づけ。

Orbi

RBR20 - AC2200 OrbiトライバンドメッシュWiFiルーター | NETGEAR

RBK20やRBK50、AC3000とか面白そうだけど、サテライト経由で不安定になるのが微妙そう。 2018年と古い。

なしかな。

f:id:guitarrapc_tech:20200102200617p:plain

Velop

Velop Whole-Home Mesh WiFi

機能は全部満たしてそう。 2018年と古い。ちょっとお高め。

なしかな。

Sila

Gaming Router - Razer Sila

4万円台で利用者が少なすぎ (情報が全然ない) 、見た目がつまらない。

なしかな。

Amplifi HD

AmpliFi | Faster, Whole-Home Wi-Fi

比較表で不明だらけでうける。 Spec はPDFが公開されています、雑だけど。

PDF: AmpliFi Datasheet

Unifi といえばピンと来る人もいそうですが、Ubiquitiが出している個人向けのメッシュルータ。 見た目が他と違ってディスプレイがあり、タッチ対応で通信状況とか見れます。

StackOverflow の中のエンジニアとかが使ってて、いい感じそうなので日本で試せないかと思っていたら出てました。 ということで、Amplifiよさそうとはじめから前向きでした。

サイトを見ると、Amplifi Alien が出たばかりで見た目からして面白そうなのでこれをしたいところですが、日本ではまだ取り扱いないので Amplifi HD で。

購入前の機器判断は公式が提供しています。

AmpliFi Help

Dual-Band、SU-MIMO(3x3 Chain, 18)、5Ghz で1300 Mbps、2.4GHz で450Mbps はあります。 MU-MIMO がないんですが、Amplifi Alien が対応しているのでいずれ載せ替えたいところ。 とはいえ、デバイスが 15台なので今のところは特に影響も感じず問題になっていません。

Unifi もどこかで試したいですね。 企業でのWifiも今ならUnifi が選択候補に入れたいところで、Yamaha などはそろそろ古い感じが半端なくなってきました。

AmpliFi vs. UniFi Review and Comparison [December 2019]

Amplifi HDを設置する

日本向けストアがあり、日本国内から発送されます。

AmpliFi HD Mesh Router – store-ui-japan

さくっと届いたので、開けてみます。

f:id:guitarrapc_tech:20200102203607p:plain
開封

ディスプレイからわかる通り、見えるところにある前提のルータです。

設定をしていきます。 ルータがすでにあるのですが、ルータからのLANは Amplifi の WAN に刺します。

デフォルトではDouble NAT になりますが、構成後は設定で Bridge に変更できます。

既にルータがあるので Bridge に変更していますが、Double NAT でも特に速度低下が顕著ではなかったので気づかず使っても大きな問題にはなりにくいでしょう。 ただし、Router として提供していた Teleport という簡易VPNは使えなくなります。 ルータある環境でこの機能いらないからいいんですけど。 Enabling Bridge Mode – AmpliFi

設定はアプリやWebから行えますが、基本アプリになるでしょう。 Web は、IP か http://amplifi.lan/ でアクセスできます。(Bridge だとIP)

ユーザー認証をして、SSIDを設定すればもう使えます。

5GHz、2.4GHz で同一SSID が利用できるので、基本Wifi接続は一本化されます。 SSID を分離もできますがしないほうがメッシュではいいでしょう。

Guest Wifi も設定可能なので、必要な時だけ有効にすればWifiを提供するときに便利。

WPSも可能です、タッチスクリーン長押しでWPS有効化ができるのは面白く便利感あります。(WPS使わないけど)

アプリはユーザー認証するので、外出先からでも設定できます。

f:id:guitarrapc_tech:20200102210308p:plain
Wifi一覧

外出先から設状況が確認できるのはうれしみがあります。

f:id:guitarrapc_tech:20200102210452p:plain
設定

f:id:guitarrapc_tech:20200102210431p:plain
デバイス一覧

今どきのメッシュルータっぽく、速度検査もアプリからできます。

f:id:guitarrapc_tech:20200102205005p:plain
ステータス

f:id:guitarrapc_tech:20200102204920p:plain
速度検査

クライアント1つ1つの接続状況をアプリで確認しつつ、接続の一時停止もできるのでケイオスモンキーになりきることができて便利。

タッチスクリーンからは、時計、通信量、リアルタイム通信状況、ポート状況などが確認できます。 Night Mode があり、特定の時間はLED をオフにできるので、夜でも目に優しい。

f:id:guitarrapc_tech:20200102205943p:plain
通信量

f:id:guitarrapc_tech:20200102210010p:plain
通信状況

f:id:guitarrapc_tech:20200102210035p:plain
ポート状況

もともと集合住宅のインターネット回線で、下り100Mbps 程度なので速度も特に低下なく過ごしています。 そろそろ IPoE に切り替えよう。

REF

2019年に使ったサービス

2018年から2019年でどうなったのか見てみます。 今年は一個一個のサービスにコメントせず、変化あったやつや新規とかのみで。

tech.guitarrapc.com

基本方針は変わりません。

  • 有料・無料で同一程度のサービスがある場合無料のものを選択する
  • 有料のサービスはサブスクリプションで、月ベースでのみ使う

目次

有料

既存のサービスの利用方法が微妙に変わってきました。

サービス名 価格 種類 タイプ 用途
AWS $4.64/month クラウド 継続 Route53 / Lambda / S3 / KMS (2013年~
Amazon Prime \4900/year 買い物 継続 ネットショッピング、3900円から値上がりした (2014年~
GitHub Pro $7.00/month DVC 継続 Protected Branch を含めた有料機能 + コントリビューター3名を超えるため (2013年~
GitKraken $49/year Git GUI 継続 macOS/Windows両方で利用 (2016年~
G Suite Basic \600/user/month オフィス 継続 Gmail / Group / Calendar / Drive & Document / Photo (2013年~
Jump+ \900/month 雑誌 継続 アクタージュ他が面白くて継続 (2016年~
Udemy コース次第 スクール 継続 技術系の動画スクール。微妙 (2017年~
はてなブログ \8434/year ブログ 継続 今使ってるマネージドなブログサービス (2013年~
マガジンポケット \840/month 雑誌 継続 ブルーロックが面白くて継続 (2018年~
Money Forward \500/month 家計簿 継続 キャッシュフロー管理 (2018年~
Unity Plus \4,200/month 開発 継続 開発環境 (2018年~
Open Collective $5/month 開発 継続 UniRx の支援 (2018年~
GCP \0/month クラウド 無料->有料 開発環境 (2016年~
Azure \0/month クラウド 無料->有料 AzureFunctions / AppService / AKS メイン (2015年~
Apple Music \1,480/month 音楽 新規 ストリーミング (2019年~
Goland \22,900/year 開発 新規 Golang 開発用に

AWS

Oragnization を分離して色々やってます。 課金増えてるのはKMSです、何気にRoute53 より多くて最もコストがかかる。 また、Cloud Formation でリソースを実験してた時にボリュームが残っててずっと課金されていたのにさっき気づきました、Cloud Formationやっぱりつらい。

Udemy

Udemy ほぼ見なかった。 本をメインで読んで、ずっと書いてたのですが、うーん、見るものか悩ましい。

はてなブログ

カスタムドメインのため Pro を1年更新で使っています。 2019年は多めに記事を書いてみました。 サイトはシングルカラムに移行しました。記事だけ読みやすければいいのですが個人的には読みやすくなった。 あとクッキー表示回り仕込んでおきました、これは今後来そうなので先回り。

Qiita の云々ではないですが、自分のブログを持っているのはやはりよいものです。 とはいえ Wordpressなどを構築、保持したく、適当なジェネレーターもあんまり好みでないので悩ましい。 Medium もなし判断なので、さて。

Money Foward

Zaimより圧倒的にいいです。 出費はクレジットに集約して、現金は細かくハンドルしない方針にしているので出費計測が本当に楽です。 現金はそもそもめったにないので、もうこれでいい感じ。

ただ、某銀行がChrome拡張でログインをはじいてブロックされることが多発するのでちょっといい加減銀行変える方針。

OpenCollective

去年書き忘れてましたが、UniRx の支援に使っています。 さて、今なら GitHub Sponsers あるしそっちにしたほうがいいのでは説が.... リリース情報も同期しないので Open Collective だけ見て伝わらないのはないかなぁ。

GCP

無料枠なくなって有料

Azure

Subscription 切れて、Visual Studio もMonthly なので課金になってしまった。

Apple Music

iTunes で買っていたのですが、Android でも使えることを知ってそろそろいいかなと。

実際、映画見たあとにそのサウンドトラック聞いたりが楽になったので今のところよい感じ。

Goland

VSCode で書くのに疲れました。 JetBrains IDE ちょくちょくうーむってなるものの、便利。

買い切り

サブスクリプションではない買い切りです。サービス以外にアプリやハードもあります。実際のところ書いていないハードは他にもありますが、開発と関連するところはこんな感じで。

昨年からの継続が混じっています。

サービス名 価格 種類 タイプ 用途
Flawless $35/買い切り 開発 継続 iOS開発アプリ (2017年~
Genius Productivity Bundle $8.99/買い切り PDF取り込み 新規 スマホでの事務処理アプリ (2018年~
Charles Proxy \1080 / 買い切り 開発 継続 iPhone でのプロクシ解析アプリ (2018年~
Tile \3,110/個 スマートタグ 継続 なくしたくないもののGPSトラッキング (2018年~
Google Home \15120/個 スマートスピーカー 継続 ok, google (2018年~
Apple TV 4K \19800/個 リモートディスプレイ 継続 macBookの映像だしたりAmazon Prime Video
YubiKey 5 NFC \6700/個 2FA 新規 FIDO U2F対応しているサービスは一通りYubikey に変更 (2019年~
Roomba e5 \54000/個 掃除機 新規 掃除して (2019年~
Google Nest Hub \15400/個 スマートスピーカー 新規 ok, google (2019年~
Switch Bot \3,980/個 IoTハブ 新規 (2019年~
Switch Bot 温湿度計 \1,980/個 IoTハブ 新規 温湿計(2019年~
Amplifi HD \18,398/個 Wifi 新規 メッシュ (2019年~
Yamaha YAS-109 \22,357/個 SoundBar 新規 PCスピーカー (2019年~
Anker PowerWave 10 Dual Pad \3999/個 Qi 充電 新規 充電パッド(2019年~
Philips Hueモーションセンサー \4165/個 Hueトリガー 新規 Hueをセンサーで駆動 (2019年~
Philips Hueライトリボンプラス スマートLEDライト \9269/個 リボンライト 新規 興味あったので試した (2019年~

機器の購入ちょこちょこしてました。 特に身の回りの連動回りの更新で、2018年よりだいぶんよくなったので次はどれに手を付けようかなぁ。

Apple TV 4K

結構自然に使うようになってきたようです。 ほっておいても活用していたので、生活の一部に入ったようでよかったよかった。

Yubikey 5 NFC

FIDO U2F にしたかったので。 冷静に考えて NFC が iOS で利用を想定したアプリなくて意味ないと思いきや、 iOS13.2 で対応来るのでそろそろ iOS アップグレードするか。

FIDO U2F が一個しか登録できないサービス多すぎでは。 あと Windows Hello も連動しないので、これは引き続きカメラでログイン。

Roomba e5

そろそろ入れようと思って買いました。 掃除機をどれぐらいかけたいかって人によって違うので、普段から勝手にきれいになったほうが平和なのです。

ごみのたまる量を見ていると案外たまる.... のでよかったよかった。 水洗いできるのも結構うれしいです。

Google Nest Hub

Google Home 使ってて、料理のアラームによく使うのですが、後何分!?っていうのがいちいち聞くのも面倒でどうしたものか。 だったのが、可視化されるようになってさっそく役立ちました。(おでん作った

複数人にアドバイスもらって、まさにその通りだったので私もオススメ。 正直 Google Nest Mini とか Google Home 買うなら、Google Nest Hub を買ったほうがいいです。(重いので落ちないようにできないならやめたほうがいいです

Switch Bot & Switch Bot 温湿度計

Nature Remo のYAS-109 接続との競合問題で、どうにも我慢できずもはや Nature Remo から変えるのが適切と判断しました。 温湿度計は、温度と湿度が簡単に見れるようになる + アプリでもよく見えるところに可視化されて経過も確認できるのがいいです。

ただ、Nature Remo のカスタムボタンのような利便性がないので、よくなるとうれしいです。

Amplifi HD

これまで Aterm 使っていたのですが、そろそろ面白いWifiにしようと思って変えました。 記事は別途。

Bridge 接続することで Double NAT を起こさないようにもできるのでいい感じ。

Yamaha YAS-109

今まで使っていたスピーカーをほかに移したのでサウンドバーにしてみました。 が、Nature Remo とアプリが競合でうーん。

さらに、Bluetooth がPINなしで接続できるために他人が接続してきたケースが複数回発生して、これはヤバイ..... もてあましますね。 Bluetooth の時間差も比較的大きいので失敗購入の筆頭。

Anker PowerWave 10 Dual Pad

Roomba がいると困るのがケーブルです。 充電周りのケーブルは結構巻き込みで3本ほどやられたので、全面的に Qiに移行しました。

Qi 一つだと機器での取り合いが起こるので、Dual Pad は本当に便利でおすすめ。

Philips Hueモーションセンサー

家に帰って 「Ok, Google ただいま」するまでに暗い、電気付けるのめんどう、事前に「これから帰るよ」言うの忘れた時につらかったので対処しました。 家の玄関が人感センサーがあれば不要なのですが、ないときはこれを玄関に磁石で貼り付けて仕込めば、センサーになります。

圧倒的、これでいい感。

Philips Hueライトリボンプラス スマートLEDライト

2年前から興味あって、使いどころないなぁと思って放置していましたが、間接照明してみようと思って買ってみました。 机の下に貼ってあるのですが、つけるとそれっぽくなる。

けど、ただの興味で実用性皆無なのでまぁいいか感。

階段の段差や壁角の際のような注意する必要なところに、Hueモーションセンサーと併用して使うのがよさそう。

無料

サービス名 価格 種類 タイプ 用途
Azure DevOps 無料 CI 継続 .NET / PowerShell ビルド (Visual Studio Team Service のブランド変更)
Appveyor 無料 CI 継続 .NET/PowerShell ビルド
Circle CI 無料 CI 継続 .NET / Golang / 他 ビルド
draw.io 無料 構成図 継続 構成図を描くのに便利
Docker Hub 無料 コンテナリポジトリ 継続 コンテナ置き場
Eight 無料 名刺管理 継続 名刺はEight で交換しましょ....
Fastly 無料 CDN 継続 検証に Developer Account で。
Google Analytics 無料 Web 継続 ブログとか
Google Adsense 無料 広告 継続 ブログ
Kibela 無料 Wiki 継続 ドキュメント/Wiki/ Blog / 勉強会メモ
Slack 無料 チャット 継続 個人のいろいろストックです
一休 無料 予約 継続 レストラン、ホテル他
IFTTT 無料 グルー 継続 連動系はこっち
Zapier 無料 グルー 継続 連動系の検証に
Integromat 無料 グルー 新規 インスタントは処理はこっち
duet 無料 リモートディスプレイ 継続 MacBook のディスプレイ拡張
NearLock 無料 macOS のロック 継続 MacBook を iPhoneでロック
LinkedIn 無料 プロフィール 新規 紹介
Wantedly 無料 プロフィール 新規 紹介
JapanTaxi 無料 タクシー 新規 困ったときに便利
ネットワークプリント 無料 プリンター 新規 コンビニプリント
Bitwarden 無料 パスワード管理 新規 マルチプラットフォームでの動作 (2019年~
Lingvist 無料 英語 新規 リハビリ (2019年~
PayPay 無料 QR決済 新規 WeChat的な決済だけのやつ (2019年~
Microsoft To Do 無料 TODO 新規 Wunderlist がおわこん (2019年~
Fork 無料 Git GUI 新規 GitKraken が承認されないときに (2019年~
Otter 無料 SpeechToText 新規 すご (2019年~
PhotoMath 無料 数式OCD 新規 すご (2019年~
Warp 無料 DNSリゾルバ 新規 公衆環境で (2019年~

Appveyor

解約予定。 Windows でのビルドに使っていたのですが、いい加減なくしたい。

Bitwarden

2019年早々にTeamsId からの移行したやつです。 一年運用してみて、やはりいい感じなのでこのまま維持で。

課金していいなぁという気分もありつつ、自前クラスタで管理はあんまりしたくないものの、Webそこまで信用できるかというと、うーむ。 で、悩ましさも感じています。

tech.guitarrapc.com

Lingvist

リハビリに入れています。

PayPay

現金払いのところでも PayPay は行けるので、やるかと思って入れたところです。 が、どうにも微妙そうなのでなしかなぁ。

Microsoft To Do

Wunderlist が終わるので移行しました。

tech.guitarrapc.com

Fork

GitKraken は、OAuth のOrganization 許可とかいるので時々アレでソレになるのでそんな時に。 SourceTree ライクで10倍安定していていいのですが、GitKraken のような複数プロファイルができず使い勝手はそんなに良くないです。

できれば使いたくない、GitKraken 使っておけってお気持ちですが使うこともあるので、残念ながら時々使います。

Otter

Speech To Text です、便利。

PhotoMath

数式を読み取って数式の計算ができます。

Warp

CloudFlare の 1.1.1.1 通信を常に暗号化してトラフィックを保護してくれる。 公衆環境で接続せざるを得ないときに、まぁ接続しないのですが、準備として。

無料継続(利用がなかったもの)

いらないというより、使う機会が乏しい

サービス名 価格 種類 タイプ 用途
Heroku 無料 PaaS 継続 アプリホスト
Visual Studio App Center 無料 CI/Analytics 継続 開発
Cloud Craft 無料 構成図 継続 3D系を書かなかった
inVision 無料 デザイン 継続 プロトタイプ前でした

2018年同様に、どれも触らなかった。 やはりこれらは使わない気がする。

Heroku は使ってもいいチャンスが全然なくなった気がするので、そろそろアカウント消そうかなぁ。

解約

サービス名 価格 種類 タイプ 用途
TeamsId $3/user/month パスワード管理 解約 チーム管理の楽さが神がかってる
Wunderlist 無料 TODO 解約 TODOの管理
Nature Remo \12,980 IoTハブ 機器取り外し Yamaha YS-109 との相性問題
Nature Remo Mini 2W1 \6,580 IoTハブ 機器取り外し Yamaha YS-109 との相性問題

TeamsId

2018年までお世話になりました。2019年1月時点で、Bitwarden に乗り換えて数か月様子を見て問題なかったのでグッバイ。

Wunderlist

2020年5月6日にサービスが終了するので、Microsoft To Do に移行しました。

Nature Remo & Nature Remo Mini 2W1

長らく赤外線機器の連動に利用していました。 しかし、Yamaha YAS-109 の SoundBar Controller を起動すると Nature Remo が全滅する事案があって Switch bot に移行しました。

tech.guitarrapc.com

今後使う可能性があるサービス

サービス名 価格 種類 タイプ 用途
Kyash 無料 ウオレット 新規 新規 | 割り勘時かな

Kyash

2018年はチャンスをうかがって使わなかったのですが、まぁよさそうかも?

検討して使わなかったサービス・機器

サービス名 価格 種類 タイプ 用途
Visual Studio Pro 標準サブスクリプション \102,687 開発 検討 Azureいらない
Notion 無料 Wiki 新規 使い勝手が微妙すぎる
ScrapBox 無料 Wiki リトライ おしい
AirPods Pro \27,800 イヤホン 新規 微妙すぎる

Visual Studio Pro Subscription

Monthly でいいでしょという。

f:id:guitarrapc_tech:20200102035714p:plain

Notion

やはり微妙。個人では使うことはない。

ScrapBox

別にリンクが欲しいわけじゃない。便利だけど。

Markdown 互換が重要ではないものの、やはり互換が必要なシーンが多いので細かいところで微妙。

ただ、個人的には嫌いじゃないので、引き続きチャンスは伺いたいところ。

AirPods Pro

物自体はいいんですが、バッテリー持ちがしょぼい。 次の世代に引き上げてくれた気配はあるのですが、もう音楽聞かずに集中するように体調を戻したのでいらない。

もともと音楽聞かなかったのですが、聞くことで集中しようとしていたのでそれを矯正しました。 いろいろ話かけられやすい体制を表現したかったのもあります。

まとめ

めちゃめちゃ時間かかった。一日書いてた気がする。 把握していても書き出すのがツライ。何かサービス.... Bobby も違うし困ったなぁ。

会社のは kibela にまとめてて一瞬で出るんだけど。

Wunderlist の移行先の検討と移行

Wunderlist を5年余り使っているのですが、ここ3年はサービス終わる終わるといわれ続けても移行先を時々探しては見つからず断念してきました。

と言っていると、ついに Microsoft から本当に終わらせる宣言が出たので移行先を検討し、移行しました。

Wunderlist will shut down on May 6, 2020. After that date, you'll no longer be able to update or edit your lists or tasks. We recommend exporting your account or importing your lists and tasks to To Do before then.

With our importer it's easy to move your lists, tasks, subtasks, files and notes to To Do. First, you just need to get Microsoft To Do. Then, head to your To Do settings and select the option to import.

Wunderlist Support Center | What's next for Wunderlist?

2019年ぎりぎり12/31 に移行していたことに、後から突っ込まれて気づいたという。

目次

TL;DR

  • Wunderlist と同様の機能を、数の制約なく満たそうと思うと Microsoft To Do が最も近い
  • 無課金で、少人数でtodoをシェアしつつ、数上限も気にせずに使うには Microsot To Do が満たしている
  • ただし Microsoft To Do のシェア機能はリンクの共有、リンクを知っていれば共有。それ以上の共有を制限できるが残念。

必要な機能

Wunderlistは、個人 +α の二人で必要なTODOを共有し、お互いの共通認識にしつつ、非同期に自由なタイミングでそれらを解消していくために使っています。 そのために使っているWunderlistの機能が必要機能と定めました。

単純なTODOとして利用しているので、TODOとしての管理に特化していることを重視しています。

リストを30余り使っており、リストを用途別に分割を行うので上限があると厳しいので、量は大事。

  • TODO タスクをまとめ上げるリスト機能
  • リストをまとめ上げるフォルダー(グループ)機能
  • Complete したタスクをサクッと確認、Undoする機能
  • リストの共有機能
  • タスクのアサイン、期限、繰り返し機能
  • タスクへのメモ追加
  • タスクの並び替え
  • タスクの他リストへの移動機能
  • Due date なタスクの表示機能
  • Assign されたタスクの表示機能
  • リストの上限がない

可能であればほしい機能は次の通りです。

  • Microsoft アカウントは全てなくしたいので、Google ログインか Sign in by Apple に対応
  • 共有時は、相手にプッシュ通知などで通知してほしい
  • 一度ユーザーを共有していれば、共有時に候補を出してほしい
  • タグができるとうれしい (場所とか
  • 検索できるとうれしい (タグ検索とか
  • ユーザー名変更
  • タスクの並び替え機能

いらない機能も決めておきます。

  • テーマ変更
  • 画像変更
  • タスクの中でタスクを作るサブタスク機能
  • 重要マーク
  • プロジェクト自体へのコメント機能
  • Kanban 機能

Wunderlistの外観

Wunderlist の見た目を把握しておきます。 TODOアプリは使い勝手がUIに左右されるので見た目は重要。

f:id:guitarrapc_tech:20200101033712p:plain
Wunderlist

候補

検討候補は、次の通りです。並び順は当初考えていた移行優先順位です。1

  • Todoist
  • TickTick
  • Microsoft To Do

Google Todo は話にならないのでなしです。アレはダメ。

幸い全ツールが移行ツールを持っていたので順にみてみます。

検討の末、最終的には Microsoft To Do にしたのですが何がどうだったのか見ていきます。

Todoist

f:id:guitarrapc_tech:20200101025832p:plain
Todoist

必須な機能の状態です。

  • [x] TODO タスクをまとめ上げるリスト機能
  • [ ] リストをまとめ上げるフォルダー(グループ)機能 -> Projectの入れ子で代用
  • [x] Complete したタスクをサクッと確認、Undoする機能
  • [x] リストの共有機能 -> ~5 people
  • [x] タスクのアサイン、期限、繰り返し機能
  • [ ] タスクへのメモ追加 -> Premium
  • [x] タスクの並び替え
  • [x] タスクの他リストへの移動機能
  • [x] Due date なタスクの表示機能
  • [ ] Assign されたタスクの表示機能
  • [ ] リストの上限がない -> ~80 Project、Premium ~300 Project

可能であればほしい機能の状態です。

  • [x] Microsoft アカウントは全てなくしたいので、Google ログインか Sign in by Apple に対応 -> Google Login
  • [x] 共有時は、相手にプッシュ通知などで通知してほしい
  • [x] 一度ユーザーを共有していれば、共有時に候補を出してほしい -> 1 Projectで共有すればその共有をほかのProjectで利用可能
  • [x] タグができるとうれしい (場所とか -> ラベルで代用。@ラベル で付けられて検索も可能
  • [x] 検索できるとうれしい (タグ検索とか -> クイック検索が可能
  • [x] ユーザー名変更
  • [x] タスクの並び替え機能

価格の違いを見ておきます。

Pricing | Todoist

f:id:guitarrapc_tech:20200101025211p:plain

操作自体は直感的です。検索も可能で、タスク操作もクリックやメニュー操作で困ることはありません。

f:id:guitarrapc_tech:20200101030248p:plain
クイック検索

セクションが追加可能で、Projectの中で区切りを作れるのも使いやすいです。

f:id:guitarrapc_tech:20200101030456p:plain
セクションでProjectを中で分離できる

ただ、フォルダーの概念がないのが致命的で使いませんでした。 フォルダーがないので、親プロジェクトを作ってプロジェクトをまとめることで運用することになります。 Webでは親プロジェクトを見ると子プロジェクトが表示されます。(いいじゃん!) しかiOSネイティブでは、親プロジェクトを選んでも子プロジェクトは見えません。 そして、親プロジェクトは触ると選んでしまう.... ただ開閉したいだけなのに。 ただプロジェクトをまとめ上げたくても操作をミスってしまい、ミスるとストレスがたまるのでちょっとないという結論でした。

リストの上限は、80あれば今は十分だったので問題ありませんでした。 メモがPremiumでのみ追加なのは、リンクを貼ることもできないのでないです。

総じて操作はいいのですが、Projectで賄うのはちょっと厳しかった。

TickTick

f:id:guitarrapc_tech:20200101031519p:plain
TickTick

必須な機能の状態です。

  • [x] TODO タスクをまとめ上げるリスト機能 -> 99 tasks per list、Premium 999 tasks per list
  • [x] リストをまとめ上げるフォルダー(グループ)機能
  • [x] Complete したタスクをサクッと確認、Undoする機能
  • [x] リストの共有機能 -> ~2 member per list、Premium 19 member per list
  • [x] タスクのアサイン、期限、繰り返し機能
  • [x] タスクへのメモ追加
  • [x] タスクの並び替え
  • [x] タスクの他リストへの移動機能
  • [x] Due date なタスクの表示機能
  • [x] Assign されたタスクの表示機能
  • [ ] リストの上限がない -> ~9 list、Premium 99 list

可能であればほしい機能の状態です。

  • [x] Microsoft アカウントは全てなくしたいので、Google ログインか Sign in by Apple に対応 -> Google Login
  • [x] 共有時は、相手にプッシュ通知などで通知してほしい
  • [x] 一度ユーザーを共有していれば、共有時に候補を出してほしい -> 1 Projectで共有すれば候補が出る
  • [x] タグができるとうれしい (場所とか -> 可能
  • [x] 検索できるとうれしい (タグ検索とか -> クイック検索が可能
  • [x] ユーザー名変更
  • [x] タスクの並び替え機能

価格の違いを見ておきます。

What are the differences between TickTick Free and TickTick Premium? – TickTick Help

f:id:guitarrapc_tech:20200101031749p:plain

リストの数が足りず断念しました。 これは共有先のユーザーも、その共有分リストを使います。 そのため、自分のリストを共有するだけで足りず、リストを積極的に分離していくようにしているのでなかなか厳しいものがありました。 課金しても99はちょっと厳しい。

一方で、フォルダーはあるし必要な操作も網羅しています。

ばっちりだったのですが、リストの数上限だけが残念でした。

Microsoft To Do

f:id:guitarrapc_tech:20200101033857p:plain
Microsoft To Do

必須な機能の状態です。

  • [x] TODO タスクをまとめ上げるリスト機能
  • [x] リストをまとめ上げるフォルダー(グループ)機能
  • [x] Complete したタスクをサクッと確認、Undoする機能
  • [x] リストの共有機能
  • [x] タスクのアサイン、期限、繰り返し機能
  • [x] タスクへのメモ追加
  • [x] タスクの並び替え
  • [x] タスクの他リストへの移動機能
  • [x] Due date なタスクの表示機能
  • [x] Assign されたタスクの表示機能
  • [x] リストの上限がない

可能であればほしい機能の状態です。

  • [ ] Microsoft アカウントは全てなくしたいので、Google ログインか Sign in by Apple に対応 -> Microsoft アカウント統合
  • [x] 共有時は、相手にプッシュ通知などで通知してほしい -> AirDropで通知いくのでok (リンクの共有 or Email or AirDrop)
  • [x] 一度ユーザーを共有していれば、共有時に候補を出してほしい -> AirDrop で十分間に合う
  • [x] タグができるとうれしい (場所とか -> 可能
  • [x] 検索できるとうれしい (タグ検索とか -> クイック検索が可能
  • [ ] ユーザー名変更 -> アカウント統合されてて変更不可
  • [x] タスクの並び替え機能

価格がなく、Office365 ユーザーとそうでない場合で違いはありません。

必須な機能が網羅されています。 可能であればほしい機能はないのですが、どれも飲むことはできます。

2020/4 AirDrop での共有ができるようになって便利になって最高でした。 共有する相手と離れていない限りはこれで十分です。

共有に関しては、どのツールよりも使いにくく、共有リンクを直接シェアするか Email しかありません。 また、一度共有できても他のリストで共有する時に候補としてもでないので手間が永遠に楽にならないのは面倒極まりないです。

f:id:guitarrapc_tech:20200101034750p:plain

まとめ

必須機能は大事。要点抑えてあれば移行先は見つかるでしょう。 私は比較した結果Microsoft To Do がよかったので、これでいきます。

なお、Google Todo は無理。


  1. Wunderlist の創業者のTwitter を見ているといろいろ移行している人のツールが出てくるので便利。

Pulumi Workaround

この記事は、Pulumi dotnet Advent Calendar 2019 の25日目です。

qiita.com

最終日は、Pulumi でこんなときどうするのかをまとめていきます。

目次

TL;DR

Pulumi でトラブルに遭遇したときにどのように回避するかのワークアラウドです。

随時更新予定。

Pulumi.Aws.Iam.Invokes の Input<T>Output<T> の依存解決を行えない

Pulumi の DataSourceは、値が決定的に定まっていることを前提にしているため、 Output<T> を受けることを想定していません。

つまり以下のコードは失敗します。

    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Pulumi;
    using Pulumi.Aws.Iam;
    using Pulumi.Aws.Iam.Inputs;
    
    class Program
    {
        static Task<int> Main()
        {
            return Deployment.RunAsync(async () =>
            {
                var policy = await Pulumi.Aws.Iam.Invokes.GetPolicyDocument(new GetPolicyDocumentArgs
                {
                    Statements = new[] {
                        new GetPolicyDocumentStatementsArgs
                        {
                            Actions = "sts:AssumeRole",
                            Effect = "Allow",
                            Principals = new GetPolicyDocumentStatementsPrincipalsArgs
                            {
                                Type = "Service",
                                Identifiers = "ec2.amazonaws.com",
                            }
                        },
                    },
                });
                var role = new Pulumi.Aws.Iam.Role($"role", new RoleArgs
                {
                    AssumeRolePolicy = policy.Json,
                });
    
                var assumepolicy = await Pulumi.Aws.Iam.Invokes.GetPolicyDocument(new GetPolicyDocumentArgs
                {
                    Statements = new[] {
                        new GetPolicyDocumentStatementsArgs
                        {
                            Actions = "sts:AssumeRole",
                            Effect = "Allow",
                            Principals = new GetPolicyDocumentStatementsPrincipalsArgs
                            {
                                Type = "Service",
                                Identifiers = "ec2.amazonaws.com",
                            }
                        },
                        new GetPolicyDocumentStatementsArgs
                        {
                            Actions = "sts:AssumeRole",
                            Effect = "Allow",
                            Principals = new GetPolicyDocumentStatementsPrincipalsArgs
                            {
                                Type = "AWS",
                                // throws exception here!
                                Identifiers = role.Arn,
                            }
                        }
                    }
                });
    
                return new Dictionary<string, object>
                {
                    { "arn", role.Arn },
                    { "assumepolicy", assumepolicy.Json },
                };
            });
        }
    }

もし Output<T> な値を受けて、Data Source の取得を行いたい場合は、Output<T>.Apply でDataSource を Output の結果を受けて実行されるようにし、出力も Output<T> に変換します。

    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Pulumi;
    using Pulumi.Aws.Iam;
    using Pulumi.Aws.Iam.Inputs;
    
    class Program
    {
        static Task<int> Main()
        {
            return Deployment.RunAsync(async () =>
            {
                var policy = await Pulumi.Aws.Iam.Invokes.GetPolicyDocument(new GetPolicyDocumentArgs
                {
                    Statements = new[] {
                        new GetPolicyDocumentStatementsArgs
                        {
                            Actions = "sts:AssumeRole",
                            Effect = "Allow",
                            Principals = new GetPolicyDocumentStatementsPrincipalsArgs
                            {
                                Type = "Service",
                                Identifiers = "ec2.amazonaws.com",
                            }
                        },
                    },
                });
                var role = new Pulumi.Aws.Iam.Role($"role", new RoleArgs
                {
                    AssumeRolePolicy = policy.Json,
                });
    
                var assumepolicy = role.Arn.Apply(roleArn => Pulumi.Aws.Iam.Invokes.GetPolicyDocument(new GetPolicyDocumentArgs
                {
                    Statements = new[] {
                        new GetPolicyDocumentStatementsArgs
                        {
                            Actions = "sts:AssumeRole",
                            Effect = "Allow",
                            Principals = new GetPolicyDocumentStatementsPrincipalsArgs
                            {
                                Type = "Service",
                                Identifiers = "ec2.amazonaws.com",
                            }
                        },
                        new GetPolicyDocumentStatementsArgs
                        {
                            Actions = "sts:AssumeRole",
                            Effect = "Allow",
                            Principals = new GetPolicyDocumentStatementsPrincipalsArgs
                            {
                                Type = "AWS",
                                Identifiers = roleArn,
                            }
                        }
                    }
                }));
    
                // you can pass assumepolicy to other Resource.
    
                return new Dictionary<string, object>
                {
                    { "arn", role.Arn },
                    { "assumepolicy", assumepolicy.Json },
                };
            });
        }
    }

Pulumi-aws の destroy で vpc 削除が何度やっても失敗する

pulumi destory をしたときに、vpc の削除がどうしても失敗することがあります。

    error: Plan apply failed: deleting urn:pulumi:ekscluster::sandbox::pkg:component:ekscluster$pkg:component:network$aws:ec2/vpc:Vpc::sandbox-network-vpc: Error deleting VPC: DependencyViolation: The vpc 'vpc-052ade5d4667965e8' has dependencies and cannot be deleted.

これは Secutiry Group で、自身の Security Group を参照しているときにおこります。 特に、EKS Cluster などが自動的に作成した Security Groupで、自分自身の Security Group を参照しているときに起こりま す。 Pulumi が知っていれば自分で解消するので、知らない状況を作らないようにするのがいいでしょう。

と思っても、Kubernetes 1.14 + eks.3 以降は、EKS デフォルトの挙動として PulumiなどAPIで指定したセキュリティグループは Addtional Security Groupになり、EKS のデフォルト Security Groupに自身を許可するSGを自分で作るようになった。ので、破綻する....

pulumi up の preview と実行でそれぞれ dotnet build がかかる

pulumi up を実行すると、Preview と Up が実行されます。

  • preview が実行されプロンプトが表示
  • yes を選択するとpreview の内容が適用されます。

yes を選択したときの適用は、一見すると preview の内容ですが、実際はC# コードが再度評価されて、再度 dotnet build が実行されます。

そのため、pulumi up をして yes を選択する前に Visual Studio 上で Pulumi dotnet のコードを変更すると Preview と違う結果が実行されます。

注意しましょう。

pulumi で作成したリソースに直接変更を加えられてもpulumi が検出しない

pulumi は、デフォルトでは実リソースと自分のStateを同期しません。 そのため、該当リソースにコード変更をしない限り気づけません。

terraform のように、コード変更なしに気づくためには、pulumi refreshpulumi up --refresh を行います。

これによって、Pulumi の State と実リソースの状態が同期されて、コードに変更がなくても差分として検出されるようになります。

pulumi のリソースをプロジェクト間で移動させたい

残念ながらサポートされてません。

Support moving resources between projects · Issue #3389 · pulumi/pulumi

他プロジェクトのリソースを参照したい

terraform の remote state 的なものは、pulumi では StackReference といいますが、C# ではサポートされていません。

TypeScript ではサポートされています。

import * as k8s from "@pulumi/kubernetes";
import * as pulumi from "@pulumi/pulumi";
const env = pulumi.getStack();
const infra = new pulumi.StackReference(`acmecorp/infra/${env}`);
const provider = new k8s.Provider("k8s", { kubeconfig: infra.getOutput("kubeConfig") });
const service = new k8s.core.v1.Service(..., { provider: provider });

https://www.pulumi.com/docs/intro/concepts/organizing-stacks-projects/#inter-stack-dependencies

teraform から pulumi に移行する

やる意義があるのならやるのは選択がでるでしょう。

terraform から TypeScript への移行プログラムはあります。

pulumi/tf2pulumi: A tool to convert Terraform projects to Pulumi TypeScript programs

他の言語バインディングは今のところ見つからない。

どのみちImport 祭りになるのはちょっと辛いですが。

Adopting Existing Cloud Resources into Pulumi | Pulumi