2022年9月

育児

1 歳 10 ヶ月になった。

  • 両人差し指をほっぺにつけて「おいしー」ポーズ
  • 一緒にスイカ食べた
    • 最初はおそるおそるかじった
  • 一緒にミートソースパスタ食べて「おいしー」ポーズ
  • 風邪ひいた
    • パパがつくったおにぎりを1口で食べようとする
      • 息子氏の名前を強めに呼んだらギャン泣き
        • びっくりしたねゴメンよ。。
  • 夕飯前にアイス食べたくておねだり
    • あげなかったからかんしゃく起こした
  • 玄関ドアの鍵を開けるのにハマる
  • 自分で洋服を脱ぐようになった
    • パパママが手伝いながら
    • うまく脱げないと怒る
    • 脱いだら洗濯機やカゴに入れるそして押す
      • オムツもw
    • 靴や靴下も
  • かんしゃく起きがち
  • 叔父からもらったぶどうにハマる
  • はじめてお風呂で湯船に浸かった
    • ビビってる感じ
    • いままではシャワーだった
  • コメダ外食
    • お子様プレートたべた
    • ゼリーとアップルジュースにご満悦
    • アップルジュース飲むのめちゃ早い
  • 電車デビュー
    • 1 番目の電車は湘南モノレール
    • キョトンとしてた
    • 車掌さんにバイバイできた
  • 「コップちょうだい」って言ったらくれた
  • 「ごはんおいしいひとー?」って言ったら手を挙げた
    • しかも両手w
  • 初イケア外食
    • ぜんぶ美味しそうに食べた
    • いっぱいイケアの中あるいた
  • 歩いてる時にこけて唇切った
  • 園の先生が息子氏のことを自慢する
    • 「今日はこれができるようになったんですよ〜やってみよう息子氏くんおいで!」みたいにw
    • いつも我が子のように接してくれて本当にありがたい
  • 「えのかわ〜息子氏くーん!」って言ったら手をあげる
  • イヤなことはイヤと意思表示できるようになってきた
    • まだ「イヤ」と発言することはないが進歩
  • よくおしゃべりするようになってきた
    • まだ理解できないことばだけど進歩
  • 涼しくなってきて家から駐車場までの距離(300mくらい?)は一緒に歩くようになった
    • いままでは抱っこひもかベビーカーを使ってた

今月は初めてのできことがたくさんあった。特に、よく息子氏語でよくおしゃべりをするようになって、少しずつだけど意思疎通できるようになってきた気がする。 「ブーブー(車のおもちゃ)とって」って言ったらくれたり、「えのかわ〜息子氏くーん!」って言ったら手をあげたりしてビックリした。まだ発語はないけど、こちらも理解するように心がけよう。

あと気になったのが、世の中のパパママは割と子どもを急かすのだなと思った。例えば保育園の送迎で「はやく(車/自転車から)降りて」とか。もちろんそれが悪いってこととは思っていないし、オレもたまにあるけど、子ども最優先で考えてあげないとなと思った。急かす理由はおそらくパパママの仕事があるからとかいろいろあると思う。もっと早起きして余裕もって登園させるとか考えよう。つらいけど。

仕事

今月もテストコードをいっぱい書いた。先月よりもレベルアップしている気がしなくもない。先月みた AWS さんのライブセッションを観てから、関数ごとに以下のようなイテレーションを回せるようになった気がする。これが TDD なのだろうか。TDD 本読もう。はい。

  1. 実装する前に機能を実装するために必要なことをチェックリスト形式でまとめる
  2. 要件をもとにテストコードを作成
  3. テストが FAIL する明白な実装をする(例えば Boolean を返す関数なら return True するだけ)
  4. リファクタリングする
  5. チェックリストを Done にする

なんか、テストコード書くのって設計っぽいなと思った。要件を確認してそれをコードに落とし込むみたいな。TDD 本読もう。

あとは CI を自動化するための検証をしたり、SQL 書いたり、API を実装したりリファクタをしたりした。少しずつコードを書くのに慣れてきて、楽しいと思う時間が増えてきた。良いことだ。

その他

開発チームに異動して半年経つので、そろそろブログにまとめよう。

2022年8月

育児

1 歳 9 ヶ月になった。

  • また下痢気味
  • 2 回目の美容室カット
    • 短くなってちっちゃい時のオレに似てる..
    • わんぱく感が増した
  • 後ろあるきする
  • つま先立ちで歩く
  • 大声(奇声)を出すようになった(ぐずるとき?)
  • 追いかけっこするとゲラゲラ笑う
  • ママパパと 3 人でキャッチボールするとゲラゲラ笑う
  • 手羽中を一緒にかぶりづいた
  • 園で友達とゲラゲラ笑い合ったりするらしい
  • 園お迎え時に友達に頭をペシペシ叩かれる
    • それでも気にしない
  • 夕方に高熱でた
    • ママに抱っこしてもらえないとギャン泣き
    • パパが抱っこするとギャン泣き
    • ママが抱っこしてても急にギャン泣き
    • お盆休み直撃でかかりつけ院は全滅
    • 市のダイヤルに相談したら空いてるとこ教えてくれたありがてぇ
    • PCR は陰性だった
    • できものが増えて手足口病説浮上
    • 日に日に増えていくできもの。。
    • 痒そうで辛い
  • 夜ベッドで寝る時に暗くしてちっちゃいポータブルライト点けて「ピカピカ」ってすると真似する
    • 手をグーパーする
  • 納豆が食べられるようになった
    • 前あげた時は嫌そうだったのでビックリ
    • パパママと一緒に食べたからかな
  • ビスコデビュー
  • 同じマンションの子と仲良しに
    • 5 歳の子で息子氏と手を繋いだり追いかけっこしたり
    • 「ウチきなよ!」って言ってくれる頼もしい
  • その場でジタバタする
    • 足踏みバタバタ
  • お風呂場でおでこ打ってギャン泣き
    • たんこぶできたごめんよ。。
    • シャワーのホース踏んでコケた

今月もドタバタだった。もう慣れつつある。手足口病にかかって、一番辛いのは息子氏だと思うが、日に日にブツブツが広がっていって見ていて辛かった。1 週間ほどで良くなったのでほんとよかった。 最近はご飯を一緒に食べるようにしていて、その時息子氏が見せる笑顔がとてもかわいい。食事を準備するのは大変だが、夜に作り置きするなどして頑張ろうと思う。

仕事

テストコードをいっぱい書いた。まだ探り探りだが、少しずつコードを修正するのにためらいがなくなってきた気がする。

  • API 設計をした
    • 画面デザインを見ながら、必要なリクエストパラメータやレスポンスを openapi.yaml で定義
  • モブプロをした
  • テストコードいっぱい書いた

その他

2022年7月

育児

1 歳 8 ヶ月になった。

  • 保育園から帰宅後すぐにパパの仕事部屋にくる
    • チェアに座ってキーボードやマウスをさわる
  • 保育園で七夕の短冊バックに一緒に写真撮った
    • 「写真とりましょうか?」って言ってくれた先生方に感謝!
  • なんでもぶん投げる
    • おもちゃ、ご飯、食器
  • お風呂のとき自分でシャンプーだしてお腹ポンポンする
    • 洗っているつもりだろうけど泡はパパがキャッチしている
  • 市の文化センターで遊んだ
    • 世界中の民族楽器とかおもちゃがあった
    • 人が多くて最初は戸惑ってたけどすぐ慣れた
    • 安かったしまたいきたい
  • コップもって「ゴクゴク プハー!」ってやると笑う
    • コップをパパママに渡してそれを求める
  • 新しく買ったお野菜のおもちゃだけお片付けが上手
  • 「ごちそうさま」のマネをした!
    • 手を合わせてお辞儀
    • 手をあわせて上にあげた
    • 「ごーちゃちゃちゃっちゃ」
  • 保育参観に参加した
    • 外の窓からのぞき見する形
      • 見られそうになったらしゃがんで隠れる
    • ちょうど朝おやつのタイミング
      • 飲み物こぼしてた(平常運転)
    • 車のおもちゃで遊ぶ
      • お友達におもちゃ取られたけど気にしない
    • 滑り台であそぶ
      • 車のおもちゃを滑らせる
    • カードを箱の中にいれる
    • 絵の具であそぶ
      • 手に絵の具つけてぺったん
      • 終わったら手洗い
    • ブロックはめで遊ぶ
      • 丸と四角のブロックをはめることができた
    • ドミノで遊ぶ
      • ドミノたてる前に倒したい
    • トランポリンであそぶ
      • ジャンプはできないけど膝をまげまげ
    • 絵本をよむ
      • 『まんまるだあれ』って本
      • 上手にページをめくる
      • 家では踏んだり曲げたり破ったりするけど...
      • 先生が読み聞かせすると車のおもちゃをページで走らせる
    • 遊びに飽きたのか 10:30 ごろから甘える
      • 先生の手を引っ張って抱っこしてアピール
    • 野菜と果物のおもちゃを包丁で切る
    • おもちゃぜんぜん投げない
      • 家ではめっちゃ投げる
    • お昼ご飯
      • 真っ先に椅子に座る
      • じっとご飯がくるのを待ってる
      • 待ってるあいだ手をテーブルにトントン
      • 食事前のアルコール消毒も完璧にこなす
      • お米ぱくぱく
      • 先生はおかずとご飯をスプーンに乗せてあげていた
        • スプーン 2 つで丸める
      • ちゃっかりご飯と主菜をおかわり
      • ごちそうさまもできた!
      • テーブルに落ちてる食べかすをつまんで食べる
      • 園のご飯もたべた
        • 味付けとか参考になった
  • いとこ家族が家に遊びに来てくれた
    • 1 歳になる子もきた
    • その子と遊んでたら息子氏ギャン泣き
      • 寂しかったのかなごめんよ
  • 「緑のブーブーとって」て言ったら持ってきてくれた
    • 少しずつママパパの言っていることが分かってきたのかな
  • チャイルドシート卒業
  • パパの顔や腕を引っ掻いた
    • 冷静になれなくて手首を強く掴んだら泣いた
    • ごめんよ。。よくない。離れるなりしよう
  • 休日の昼食前にめっちゃ吐いた
    • 夕方までに 7 回吐いた
    • 顔色は良いけどあまり元気がない
    • 夕方に市の休日診療所にかかった
    • 腸炎とのこと
    • たぶん前日に当日賞味期限のヨーグルトあげたのが原因
    • 帰宅後は吐かなかったけど下痢が 5 回
    • 3 日くらいで復帰
    • 復帰後はパパママの手料理いっぱい食べてくれた
  • 家電量販店でペッパーくんに怯える(半泣き)
  • サイゼリヤデビュー
    • 初の外食
    • コーンスープとミートスパゲティとプチフォカッチャとじゃがいものやつ
    • キレイに食べました
    • 注文後すぐデリバリーされるし最高
    • ミルクジェラートたべて笑顔
  • アンパンマンミュージアムの動画に釘付け
  • お風呂後のスキンケアでクリームをポンプ押して出す(前からだけど)
    • 手についたのを洗うように伸ばしてそれをお腹にポンポンする
  • 髪乾かすときにストローマグで牛乳を飲む
    • が飲めないとママの手を取って角度を変えてとせがむ
  • しなぷしゅの「う〜〜〜がっしゃーん」の「う〜〜」を言う
    • ケーブルを挿す時やパズルをはめる時

今月はドタバタだった。。保育園に参加したり、家族全員胃腸炎にかかったり。。ほんと大変だった。 が、楽しいこともたくさんあった。サイゼリヤデビューも果たしたし、ジュニアシートに変えたり、おしゃべりが少しずつ上手になったりと息子氏の成長を感じた月だった。 まだはっきりと 1 語を話すことができなくて、若干焦りつつもあるけど、そこはじっくり進めたいと思う。いっぱい息子氏と話そう! 副鼻腔炎は良くなってきていて、お薬生活もそろそろ卒業できるかもしれない!!と希望を持って生きてる。

仕事

ドキュメント書いたりコード書いたりしていた。Weight はドキュメント作成が高め。

  • Lambda を使った某 APIリファクタリングをした
    • リファクタリングにあたり、pytest を使ったテストコードを初めて書いた
    • テストコードを書くことで、アプリケーションコードを修正するのに躊躇しなくなった気がする
    • 正常系と異常系のテストを書いた
    • moto で SQS のモックを作成
    • まだどのテストを書くべきで、どのテストを書くべきではないか、カバレッジも含めて分からないことが多いので勉強していきたい
  • Swagger UI/Redoc のドキュメント作成
    • 既存 API のドキュメントが存在していなかったため、OAS(Version 3)に準拠したドキュメントを作成した
    • Swagger ドキュメントと呼ばれることが多いのかな?
    • OAS 準拠の YAML/JSON を用意すれば Redoc でも表示が可能ということがわかった
    • GitHub と Amplify を連携させて、自動デプロイできるようにした
      • AWS リソースは CloudFormation で作成
    • Amplify の PR レビュー機能はまだ使ったことがないので今度試してみる
    • この話はどこか別でブログに書きたい
  • SQS トリガーで動作する非同期 Lambda のリファクタリングをした
    • まだ WIP だが、これもテストを書きながら進めている
    • Aurora Serverless の Data API のテストにおけるベストプラクティスをチーム内で模索中
      • テスト用 DB を作成することで落ち着いた

その他

ISUCON に参加した。今回も惨敗。。チーム内での反省会も終わり、定期的に素振りしていく予定。あしたから本気だす。

enokawa.hatenablog.jp

ISUCON12に参加した

昨年に引き続き、ISUCON12 オンライン予選に参加した。最終スコアは 2238 で、698 チーム中 426 位でフィニッシュ。

isucon.net

enokawa.hatenablog.jp

出場の経緯

去年出場して楽しかったので出場した。仕事でも 4 月から Web アプリケーションエンジニアとして Python 書いたりしてたので今のオレのベンチが取りたかった。去年は育児もあって相棒に迷惑をかけたので、1 人の方が気楽だなと思って 1 人で出るつもりだった。

けど、6 月の後半にたまたまハッカー飯@kikulabo さんと話したら「一緒に出ちゃいます?」みたいな流れになって一緒にやることになった。ちなみに @kikulabo さんは元同僚。

@kikulabo さんも Python を多少読み書きできるとのことで、コーディングに関する力量はほぼ同レベルだと思ったので、言語は Python でいくことに決めた。

準備

デプロイスクリプトの作成

昨年の反省も踏まえて、サーバー上で Vim でコードや Config を直接編集するのは、複数台サーバーへの反映が面倒すぎるのでやめたかった。ので事前に ShellScript でデプロイ用のスクリプトを用意した。make deploy-app とかでデプロイできる。予選で使ったけど便利だったので用意しておいてよかった。ちょっと使いづらい部分があって、例えば Download/Upload するファイルパスを ShellScript にコピペする必要がある。YAML とかでコンポーネント(Nginx / MySQL / App / Systemd) ごとにファイルパスを記載するだけでデプロイできるともっと楽かも。

github.com

ISUCON 本を読む

@kikulabo も読んでいて、「このへんは n 章が詳しかったです」みたいに事前にお互いに共通認識を作れたのはよかった。private-isu も通したりして、チューニングの理解を深めた。デプロイスクリプトの作成に時間を掛けすぎて private-isu は全部通せなかったことが反省点。

template repository の作成

前述したデプロイスクリプトだけじゃなくて、開発フローだったり Nginx の conf 例だったり alp のコマンド例などの便利スニペットを用意しておいた。

その他

  • レギュレーション確認
  • 当日やることチェックリスト作成
  • ISUCON11 を 2 人で通した
  • ISUCON11 の予選解説と講評記事を見た
  • ISUCON11 振り返り記事を見た

本番

ログを残していないので記憶が曖昧だけど流れを書いていく。

  • 予選当日マニュアル確認(2 人で)
  • AWS 環境構築 & サーバーセットアップ(オレ)
  • Cfn Stack 作成中にアプリケーションマニュアル読む(2 人)
  • Go のままベンチ(2722)
    • これが最高スコア...
  • デプロイスクリプト微修正 & ソースのダウンロード(オレ)
    • 11:00
  • Python に変更してベンチ(1792)
  • New Relic APM 導入(@kikulabo)
    • 12:30
    • この時点でスコア 1015
  • mysql-slow.log と Nginx の JSON ログフォーマット出力設定 (2 人)
  • APM 見て↓のクエリを改善したほうが良さそうと見当をつける(@kikulabo)
    • SELECT player_id, MIN(created_at) AS min_created_at FROM visit_history WHERE tenant_id = %s AND competition_id = %s GROUP BY player_id
    • EXPLAIN して Using where; Using temporary が出ていることを確認してインデックス貼ろうと決めた
    • tenant_id_idxtenant_id だけ指定してたので competition_id を追加
    • Using where は消えたが Using temporary は出たまま
    • GROUP BY で指定している player_id もインデックスに追加後、rows が 1/10 くらいになって Using temporary も消えた
    • この時点でスコア 1397
  • SQLite がサービスで使われていることを認識(栄野川)
    • 気づくの遅すぎな
    • App x 2, DB x 1 の構成にしたかった
    • SQLiteMySQL 移行を決意
    • 移行めんど。。
    • sqlite3-to-sql あるじゃん!運営ありがと!
      • これが罠だった..
      • 結構手直しが必要そうだぞ
      • webapp/tenant_db/*.db をすべて MySQL にぶちこめばイケる!
      • 全然おわらん。。1d 掛かるんちゃう。。
      • やめた
  • ここからお片付けモード
    • New Relic APM 止める
    • 3 号機の DB みるように設定
    • 2 号機はひましてる
    • syslog 停止
      • うまくできなかったかも
    • mysql-slow.log と Nginx のログの出力停止
    • Redis サービスを停止
    • 1 号機の DB とめる
    • 3 号機の App とめる

良かったこと

  • Docker のままでよかった
    • 最初の段階で無理に systemd に移行しない判断をとれたのはよかった
    • 移行コストが高かった
  • APM Docker にすぐ入れれたのはよかった
    • オレのおかげ
  • EXPLAIN 叩いてクエリの実行計画を確認できたのがよかった
    • ISUCON 本読んでおいてよかった
  • @kikulabo さんの player_id へのインデックス追加が GJ
  • デプロイ楽だった
  • alp 使えたの良かった

反省点

ソフト面

  • サービス再起動時にインデックスがちゃんと適用されているかどうかを確認しておけばよかった
    • ベンチが流れるとき(/initialize)に sql/admin/10_schema.sql が流れると思い込んでいた
    • init.sh をちゃんと読んでいなかった
      • 今見返すと「こりゃインデックスはられないよな。。」となる
    • 何もかも疑ってかかること
  • Go でやりたかったな
    • 個人的に勉強してたので
  • APM に頼りっきりだったのでもう少し自力で改善ポイントを見出す力をつけたい
    • APM いれるとスコア下がるし..
      • しょうがないとは思うけど精神的に少しキツい
  • アプリケーションコード 1 行も更新してない
    • もっともっとコードを読もう/書こう
      • 特にコードを読む力がない
    • デプロイの整備に時間をかけすぎたな
    • template は随時更新していこう

ハード面

  • ディスプレイ 2 枚必要
    • 今回は M1 MacBook Air と 27 inch ディスプレイ 1 枚でやった
      • もう 1 枚 23 inch ディスプレイ余ってたから使おうと思ってたけど単純に HDMI ケーブル挿すだけでは使えない
    • 1 枚は 作業用 & Discord 画面配信用でもう 1 枚は Discord 画面閲覧用
  • スピーカーとマイクほしい
    • AirPods 電池切れるしヘッドセットは疲れる
    • Shokz とか使うといいかもしれない
    • もしくはオフラインでやるか

おわりに

今年も準備不足だった。。たぶん今後も毎年いってると思う。スコアは去年より落ちたけど、コードの理解力だったり DB の理解力は去年よりも上がったと感じる。無力感のほうが大きかったが、充実感もある。

やはり普段から素振りをしないといけない。ので少なくとも 1 ヶ月に 1 回は ISUCON に関する素振りをしたい。ちまちま進めている個人開発プロダクトも Go で書いているので、少し ISUCON を意識して sqlx 使ったりしようかなと思う。(もともと echo は使っている)

とはいえ 1 年に 1 回の開催なのでなかなかモチベーションが上がりづらいなっていうのも本音。いちばんは普段の業務からコツコツと技術力だったり判断力であったりを積み重ねていくのがいいと思っている。

次は 5000 点以上を目指す!やっていくぞ。運営・スポンサーのみなさま、本当にありがとうございました!!!

2022年6月

育児

1 歳 7 ヶ月になった。

  • 食事中に手やテーブルや服についてる米をつまんで食べる
  • マクドナルドのチキンナゲットを 1 つ食べた
  • ママパパが手拍子しながら「くーるくる」って言ったら回ったり手拍子したりする
  • よく笑うようになった気がする
  • 相変わらずおもちゃ投げまくり
    • ご飯も投げる
    • 食器も投げる
  • ハイタッチが上手になった
    • 連チャンで「タチタチタチタチ!」ってやると笑う
  • 初めての園から呼び出し
    • 熱が出て元気がないので迎えにいった
  • くしゃみしたら鼻水ドバッとでる
    • 今までは口から唾液とばしてた
  • 「モグモグモグ」って手でジェスチャーしたら真似した
  • 「バイバイ」って言ったら両手で手を振ってくれる
    • 手首を回すんじゃなくて腕もいっしょに振る
  • 「バイバイ」からの上半身ブンブン回すからのその場でクルクル回る
  • 転落防止でベッドガードを導入
    • 1 辺のみで残り 3 辺は壁とクッションでガード
  • パパのチェアに座って回して喜ぶ
  • コールマンのヒーリングチェアに座らせてドヤ顔
  • パパに海苔をあ〜ん
    • パパ風邪ひく
  • 抱っこ紐(ヒップシート)に足で乗る
  • 抱っこ紐(ヒップシート)に膝で乗る
  • 耳鼻科に行った
    • 副鼻腔炎と中耳炎と診断された
    • 副鼻腔炎が原因で痰がたまって咳が出る
    • 鼻吸いしてもらってギャン泣き
    • 定期的に鼻吸いした方がいいみたい
  • マクドナルドのハッピーセットたべた
    • 初めてのドリンクカップ&ストロー
      • ストローをガジガジ噛んだけど飲めた
  • 目ヤニがすごくて眼科にいった
  • コメダ(テイクアウト)
    • サンドイッチとコメチキたべた
    • ジャンキーだいすき
  • ミスド
    • オールドファッションもぐもぐ
  • めっちゃ前髪きった
  • 玄関で自分で靴と靴下を脱ごうとする

先月に引き続き風邪気味な状態が続いた。耳鼻科にいって副鼻腔炎ということが分かってから抗生剤を処方してもらい。少しずつ落ち着いてきた。 毎週病院にいってたから夫婦共々疲弊して、テイクアウトでジャンキーフード食べすぎた。息子氏にもあげすぎたのでほどほどにしよう。。

仕事

ドキュメントを作成するために既存コードを読みこんだりしていた。 あと珍しくブログを 2 本かいた。

  • CloudFormation template 作成
    • Target tracking scaling policy を利用した ECS の Auto Scaling 化
  • プロジェクトのドキュメント整備
  • 新規プロジェクトの API 設計
    • 写真や動画を S3 にアップロードする API の設計
    • インフラは API Gateway + Lambda
    • API Gateway は 10 MB、Lambda は 6 MB のペイロード上限がある
      • ので Presined URL を発行して、フロントから S3 にアップロードする設計にした
  • 新規プロジェクトの API 作成
    • そこまで難しくなかったのですんなり終わった
  • SAM の CI/CD パイプライン構築検証
  • pytest のお勉強
  • RDS のボトルネック調査

enokawa.hatenablog.jp

enokawa.hatenablog.jp

AWS SAM ApplicationをGitHub Actions + OIDCを利用してデプロイする

CodePipeline や CodeBuild を利用したパイプラインの作成記事はよく見ますが、GitHub Actions を利用した日本語記事はあまり見かけないので備忘録として残します。 特に難しいことはしていないのですが、Actions 用の Credential(IAM User)は作成せず、OpenID Connect(OIDC) を利用して AssumeRole(WithWebIdentity) してみました。以下はサンプルのレポジトリです。

github.com

1. SAM Application の作成

公式チュートリアルを参考に、sam initsam deploy を実行します。今回は Python 3.9 で作成しています。

docs.aws.amazon.com

2. Identity provider の作成

GitHub OIDC Provider から AWS に対して Credential を要求するために、AWS 側で OIDC Provider と IAM Role を作成する必要があります。 まずは IAM で OIDC Provider を CloudFormation(template.yaml) で作成します。AWS マネージメントコンソールと CloudFormation のドキュメント、GitHub のドキュメントを行き来しながら作成しました。

docs.aws.amazon.com

https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

パラメータは以下を指定しました。これは 2022/06/27 時点での情報であり、今後変わる可能性もあるため作成の際は公式ドキュメントを確認するようにしてください。

Key Value
Provider URL https://token.actions.githubusercontent.com
Thumbprints 6938fd4d98bab03faadb97b34396831e3780aea1
Audience sts.amazonaws.com

CloudFormation template の記載方法は aws-actions/configure-aws-credentials の README を参考にしました。

github.com

3. IAM Role の作成

AWS 側の OIDC Provider で JWT を検証できたら、指定の IAM Role を利用し、一時 Credential を発行して Actions へ渡します。IAM Role には sam deploy に必要な IAM Policy をアタッチします。 IAM Role と IAM Policy も CloudFormation で作成します。IAM Role の Trust relationships も aws-actions/configure-aws-credentials の README を参考に記載しました。

IAM Role の Trust relationships(信頼関係)は以下のように指定しました。

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:enokawa/sam-cicd-sample:*"
                }
            }
        }
    ]
}

IAM Policy に必要な権限は、前述した通り sam deploy に必要なものを指定する必要があります。最小権限の原則に則った権限設定を行うことが望ましいですが、今回はおおざっぱな権限を付与しています。詳しくは以下の行を参照してください。プロダクションで利用する場合は、必要な権限やリソースを洗い出して設定するようにしましょう。

github.com

必要な権限やリソースの洗い出しにはかなりの労力が必要となりますが、以下のドキュメントが参考になるかもしれません。

aws.amazon.com

4. Secrets の登録

AWS アカウント ID やデプロイ先のリージョン、S3 バケット名など固有のリソース名は他者に知られたくないため、GitHub の Secrets に登録します。今回は Public レポジトリのため以下の設定としていますが、Private レポジトリでも利用した方がよいでしょう。

Key Value 用途
AWS_ACCOUNT_ID 12 桁の AWS アカウント ID aws-actions/configure-aws-credentials@v1 で IAM Role(role-to-assume) の ARN を指定する際に利用
AWS_REGION デプロイ先の AWS リージョン名 aws-actions/configure-aws-credentials@v1 で デプロイ先のリージョン(aws-region)を指定する際に利用
AWS_SAM_STACK_NAME デプロイする SAM の CloudFormation Stack 名 Integration test 時に Stack 名を指定する際に利用
S3_BUCKET_NAME Lambda のコードや CloudFormation template 保存先の S3 バケット sam deploy 時に S3 バケット名を指定する際に利用

5. Workflow の定義

ここまでできたら準備完了です。 .github ディレクトリ配下に Workflow や Job、Step を定義していきます。今回は、Build 用と Deploy 用で Workflow を分けてみました。YAML を修正しては GitHub に push して Actions がコケてまた YAML を修正して... を繰り返していました。試せていませんが、actionlint や act を使うことでもっとスムーズにデバッグできるかもしれません。

github.com

github.com

最終的に、以下のように無事 Actions が想定通りに動作することが確認できました。以降は、ローカルではデプロイせずに Actions からデプロイする運用を想定しています。ただ GitHub 側の障害もあり得るため、ローカルからデプロイができるように手順を準備しておいた方がよいかと思います。

まとめ

AWS SAM Application を GitHub Actions + OpenID Connect を利用してデプロイする方法を紹介しました。OIDC の利用は初めてだったのですが、IAM User を作成せずに一時 Credential を発行できるためセキュアに CI/CD パイプラインを構築できてよいですね。

参考記事

eh-career.com

zenn.dev

zenn.dev

gkzz.dev

https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect

GitHub上でのメンションをSlackに通知する

GitHub の Slack Integration の小ネタです。Slack Workspace に Integration を追加していて、/github subscribe owner/repo で subscribe している前提でのお話です。

GitHub の username と Slack の Display name が異なる場合、Issue や pull request 上で GitHub の username でメンションしても Slack の Display name に変換されません。 例えば GitHub username が enokawa で、Slack Display name が naoto_enokawa の場合、Issue/PR 上で @enokawa とメンションしても Slack では @enokawa と表示されるのみで、Slack 上で naoto_enokawa に対してメンションが飛ぶことはありません。

結論、/github signin することで GitHub username を Slack Display name に変換してくれます。ドキュメントにもその旨の記載があります。

At this point, your Slack and GitHub user accounts are not linked. You will be prompted to connect to GitHub. This is a primary step required to access the app. Alternatively, we can also connect by running /github signin.


Mentions will work only if you login to GitHub app in your Slack workspace. When you login to GitHub app with your GitHub id, we map it with your Slack id and ping you in Slack whenever you are mentioned in any of the GitHub notifications.

github.com

今回、チーム開発で GitHub を利用していて、コードレビュー依頼を pull request 上から行っても Slack に通知が飛ばなかったため、調査の上この設定を行いました。メンションを飛ばすために GitHub Actions や Slack の Webhook を用意するなどの記事を見ましたが、私たちのチームではこの設定のみで十分でした。