2023年8月

育児

2 歳 9 ヶ月になった。

  • 自分の使用済みオムツをゴミ捨て場にもっていく
  • 「ウィーンガシャン」と言う
  • 親戚の家に遊びにいった
    • 2歳間近のお友達遊んだ
    • 絶妙な距離感がある
    • 偶然おなじズボン同じ色だった
  • ゴミ捨て場であったおばちゃんに自慢する
    • 自分でオムツ捨てたよ〜って
  • 歯磨き上手になった
  • 歯医者さんで褒められてテンションあがる
    • 足ぴょんぴょん
    • 水でるやつと吸うやつはまだ怖いみたい
    • 無理に進めない形の歯医者なのでありがたい
  • 園で前歯の歯茎を打った
    • お友達が冷蔵庫のおもちゃ?を閉めるときにあたったらしい
    • 歯医者いってレントゲンとってもらった
    • 神経を痛めた可能性もあるらしい
    • 永久歯が茶色になる可能性があるらしい
  • 園の保護者懇談会があった
  • 洗車てつだってくれた
  • ゴミ捨てで缶とペットボトルを分別して捨てた
    • パパが捨てようと思ったらやってくれてビックリ
  • 「おやすみなさい」が言えた
    • その後すぐ寝たすごい

今月はいっぱいケガをした。ドンマイ。8 月はほぼ保育園休んでない気がする。すごい。

仕事

2023年7月

育児

2 歳 8 ヶ月になった。

  • パパとショッピングモールでデート
    • 洋服買うの付き合ってもらったり
    • 車のおもちゃ買ったり
    • サイゼリヤでお昼ご飯たべたり
    • お互い楽しめた
  • チャイルドシートに座らない
    • 保育園いけない
    • 無理やり座らせるとギャン泣き
    • 「おちゃ買いに行こう」って言ったら座った謎
  • 夕飯グズグズ
    • シチュー食べない
    • イス降りておもちゃで遊ぶ
    • コロッケを要望
    • コロッケたべる
    • お米も要望
    • お米たべず(???)
    • アンパンマンポテトおとして食べれず泣きそう
    • レーズンパンが目に入り要望
    • レーズンパン食べてニコニコ
  • やよい軒
    • たべず!
    • 結局スタバでワッフル食べた
    • 期間限定のピーチのやつも飲んだ
      • 「おいしいね〜」
  • ママとサイゼデート
    • 終始ニコニコ
    • 帰りなぜか車にのらずグズグズ
  • 保育園お迎えのとき車に乗らない
    • 駐車場も限られていて、他の親御さんに申し訳なくてつらい
    • 先生にフォローしてもらったありがてぇ
  • 2歳半の歯科検診にいった
    • 終始ご機嫌だった
    • いろいろ相談できてよかった
  • 悪い夢を見たのか5時に起きてギャン泣き
    • いつもは7時起き
    • 朝ごはんたべてご機嫌
    • 保育園到着して玄関で寝る
  • おんぶ要求することが増えた
  • 市の文化センターで遊ぶ
  • 初ちかくのターミナル駅
    • 最初は静かだった
  • おばぁちゃんにハッピーバースデー歌う
    • フーするのは自分
  • 串カツ田中
    • 店員さんとじゃんけんした
    • りんごジュースこぼしたごめんなさい
    • タコさんウィンナーお気に入り
    • 最後にガチャガチャできた
    • 子どもに優しくて酒も飲めるしまた行きたい

だんだんお昼寝をしなくなってきて、かつ猛暑で公園でも遊べないので基本ドライブしたりショッピングモールに行くようになった。 出費が増えてきたが、お家で過ごすのも大変なので悩ましい。8 月は一緒にご飯つくったりしようと思う。

仕事

2023年6月

育児

2 歳 7 ヶ月になった。

  • 夜寝る時間が遅くなった
  • 一緒にクッキーつくった
    • 型抜きが楽しそうだった
  • オムツを替えるのを嫌がる
    • ズボン下げるとあげる
    • 無理やり替えるとギャン泣き
  • 就寝前パパが寝室にダッシュするとついてくる
    • 寝室いかない対策
    • タイマーが鳴った瞬間ダッシュする
    • たまに息子氏が勝つ
    • そのタイミングでパパがトイレにこもってて泣きそうに
  • ヘルパンギーナにかかった
  • 手洗いお風呂こない問題
    • 強制連行しない方法で検討中
    • 今は時間かけて誘ってる
  • 咳がなかなか止まないので耳鼻科へ
    • 中耳炎らしい
    • 診察はギャン泣き頑張ったね
  • 「髪ちょっきんしようか」っていうと嫌がる
    • 「ちょっきんやーよ」
  • 「ママがんばってー」と言う
  • 食器棚の角に足の小指を打つ
    • 大人とほぼ同じ反応
  • 保育園の見学を始めた
    • 今は小規模保育園で 3 歳クラスまでなので

今月もいっぱい病院にいった。大変だった。ヘルパンギーナの症状は軽かったのでよかった。次は RS かな。。

仕事

  • CDK に入門した
  • AWS AppSync に入門した

その他

いままでドメインとかモデルとか意識せずにコードを書いていたので、とっかかりとして↓の本を買った。少しずつ読み進める。

www.seshop.com

2023年5月

育児

2 歳 6 ヶ月になった。

  • 股からふとももにかけて虫刺され?が広範囲にでた
    • 小児科いったら蕁麻疹っぽい
    • そのあと皮膚科いったら湿疹といわれた
    • 強めのステロイドだしてもらった
  • 乃が美の食パンたべた
    • 美味しそうにたべていた
  • 大きめの公園いってピクニックした
  • トーマスのパジャマきたくてギャン泣き
    • 着させるつもりだったが先に肌着きてほしいんよ..
    • 無理やり肌着着せたらギャン泣き
  • ガソリンスタンドごっこをする
  • 肉まんづくりをした
  • 初回転寿司
    • きゅうりの巻き寿司
    • ポテトフライ
    • シャリ
    • カステラ
    • ストロベリーアイスを食べた
    • 斜め前の席の親子をずっと見てた
    • 皿を入れるアレ楽しそうだった
  • 園で掃除機が左目の下にあたった
    • 先生が掃除してて引いた時にあたったみたい
    • 自宅でも 1 回あてちゃったなぁ
    • 少し青くなっていた
    • 念のため翌日眼科にいった
      • 大丈夫だった
      • めっちゃギャン泣き
      • 先生方ありがとうごさいました。。
  • 初めてバスにのった
    • 珍しく大人しく椅子に座って待ってた
    • 降りた後も整理券を大事にもっていた
  • 近くのスポーツセンターまでお散歩
  • パパがおもちゃ渡さなかったからギャン泣き
    • 投げるから取り上げていた
  • 初めてのマックシェイク(ストロベリー)
    • 初めて店内でたべた
    • テーブルが高くてうまく飲めない
  • 夜寝室にいきたがらない
    • 保湿ローションに輪投げさせて寝室まで追い込んだ
    • 輪っかはトーマス弁当箱のパッキン
  • バルタン星人を白バイに乗せてジャンプさせる
    • パパのマネ
    • めっちゃ笑う
  • 園でお友達に押されるのをパパが見た
    • 先生に聞いたら仲良いとのこと
    • おもちゃを取られて悶々として時間が経ってから怒る子もいるらしい
    • そのタイミングで声を掛けられなかったのは反省
    • 息子氏は嫌な気持ちだったかもしれない
  • 夕ご飯を一緒に食べてくれない
    • 時間をおいて好きな時に食べさせるようにした
    • あとは興味を引いたり
    • ご飯がワンパターン化してるのが原因かも...
  • 「〇〇じゃないよ〜」と言う

今月は毎週病院に行ってる気がする。。寒暖差でまた風邪っぽくなってきたので気をつける。

仕事

その他

ブログ 1 件かいた。想像以上にブクマもらってホッテントリも入って驚いている。技術記事でホッテントリ入りたいわね。。 1 人でも参考になる方がいたら幸い。

enokawa.hatenablog.jp

アルゴリズムとか疎かったので↓の本を買った。いま読み進めている途中。

gihyo.jp

インフラエンジニアからアプリケーションエンジニアになって1年経った

気づいたら入社して 8 年も経っていた。 2022 年の 4 月にアプリケーションエンジニアへ転向したので、その経緯や転向してやったこと、今やっていることをまとめてみる。

転向の経緯

自分で作りたいものを作りたかったからというのが一番大きい。 アイレットに入社してから 7 年間インフラエンジニアとして生きてきて、ほぼ毎日楽しく業務に励んでいた。5 年目くらいから「あーこれつくれたら便利だな」という場面に何度も遭遇した。 例えば、日々の業務を効率化するような Web アプリケーションや CLI、内部向け API などあったら便利なモノだ。 「よしつくったろ!」と意気込むも手が進まず、最終的には諦めて要件を纏め、コードを書くのが得意な人にお願いしたりしていた。そして要件通りのモノができあがって喜びつつも、「あぁこうやって実装すればいいのか」「実装できてすごいなぁ」「オレにもできたらなぁ」と複雑な気持ちになっていた。「いやそう思ってる暇があるならコード書けよ」と言われたら何も言い返せない。

このままじゃいかんなと思っていた矢先、育児休業から復帰するタイミングで所属していたチームが解散することとなった。 当時の上司からも「開発に異動したらもっと成長できると」とのコメントをもらい、確かにそうかもと思い自分の今後のキャリアを考える時間をつくった。

このタイミングで転職も考えた。7 年も働いてきたし、そろそろいいかなという気持ちがあったのと、業務に対するモチベーションが低下していたから。転職サイトでいくつかの企業にコンタクトをとってカジュアル面談を受けたりもした。主に自社のサービスを提供する事業会社の方と、会社やサービスのこと、ワークライフバランス(育児と仕事)、技術について話したりした。話して分かったのは、オレはこの業界・サービスの開発に携わりたいという想いがなかったということ。今までさまざまな業界のサービスのインフラ構築に携わってきたが、例えば金融系だとかゲーム系などといった特定の業界の会社にいきたいという気持ちがなかった。今までのキャリアも小学生時代から振り返ってみてもそうだった。

最終的に、特定の業界にこだわりがないので開発チームに異動することに決めた。1 社だけ、このサービスの開発に携わりたいと強く思える企業に出会いコンタクトをとってみたが、残念ながら縁がなかった。心残りはあるが、またどこかでチャレンジの機会を伺いたい。 他の企業の選考に進む選択肢もあったが、書いたとおり何がやりたいのかが明確になっていないまま進むのはよくないし、何よりもアイレットが大好きで居心地も良いというのが大きかった。ママパパの働き方にも理解があって自分の裁量で仕事できるのがありがたい。居心地の良さを求めて自社に留まることによって、成長曲線が横ばいとなってしまうことを懸念していたが、当時は家族を最優先にしたかったのでそうした。この選択が正しかったかどうかは分からないけど、現時点では技術者として成長できていると実感していて、プライベートも幸せなのでよかったと思える。

1 年間何をしてきたか

主にバックエンドを担当していて、Web サービスの API を開発している。技術スタックとしては PythonMySQLAPI Gateway、Lambda、AWS SAM などで、サーバレスで開発を進めている。直近だとキャンペーンサイトの API やバッチの実装だったり、チャットボットサービス向けのイベントドリブンで動作するコードを運用している。実際に関わっていはいないが、以下事例の構成と似たようなことをやっている。

www.iret.co.jp

異動後はトレーニングから始まり、Vue + API Gateway + Lambda + DynamoDB で簡単なサーバレスアプリケーションを構築した。教材がとてもよくできていて、フロントエンドとバックエンド間通信の概要が理解できた。このように Web アプリケーションが作られているのだなとイメージが沸いた。トレーニング終了後は少しテーマを変えて DB を MySQL に変えてみたりした。トレーニングは約 1 ヶ月で終了した。

レーニング後はチャットボット向けサービスのプロジェクトにジョインした。これが初めての複数人での開発で、どのようにチーム開発を進めていくのかを体験できた。コードレビューのフローであったりリリースフローが確立されていなかったため提案したりもした。以前からドキュメントを書くのが得意であったこともあり CONTRIBUTING.md を書いて実際に運用して、開発メンバーから良い評価をもらった。実装の部分は、SQS トリガーで動作する Lambda のリファクタリングを行い、メンバーにフォローしてもらいながら進めた。テストコードを書いてなくて、挙動を確認するにはデプロイして手動で動作確認を行う必要があった。当初はそのままテストコードを書かずに開発を進めてしまったが、今思い返すとまずテストコードを書くところから始めるべきだったと反省。

同プロジェクトで新規に API を開発することとなり、API 設計やテーブル設計にも関わらせてもらった。メンバーとあーでもないこーでもないと議論しながら設計を進めていくのは面白かった。オレ自身はじめての設計だったため分からないことだらけだったが、とてもいい経験になった。テストコードも書いた。Aurora Serverless v1 の Data API を用いたテストで実行時間が非常に長い問題にも直面した。このあたりは以下の記事に書いた。

enokawa.hatenablog.jp

チャットボットのプロジェクトが一段落したあとで、キャンペーンサイトプロジェクトにジョインした。主に API の開発やインフラの構築を担当した。良い API 設計をしてくれたメンバーのおかげで特に問題なくリリースできた。前回の反省を踏まえて開発はテストファーストで進めて、スピーディに高品質なコードが書けたと考える。テスト実行も 10 秒程度で済んだのはよかった。諸事情あって CI を整備できなかったのが心残りで、次に活かしていきたい。

インフラが強みであったことからインフラの改善なども推進した。CloudFormation のテンプレート充実化であったり、OpenAPI(Swagger UI)の AWS Amplify でのホスティングを行ったりした。OpenAPI のホスティングGitHubopenapi.yaml が commit されると Amplify でビルドが走りデプロイされる。複数のプロジェクトで、同じ仕組みで動いていて嬉しい。今後はインフラエンジニア時代に使っていた Terraform をやっていきたいと考えている。CloudFormation も好きだが、やはり terraform plan の安心さが欲しい。オレが CloudFormation をちゃんと理解できていないだけだが、デプロイ時に意図しない挙動(変更されるはずのないリソースが更新されたり)をしたりしている。change set の差分わかりづらい。

とあるプロジェクトで Flutter も触った。アプリケーションエンジニアという肩書なのでチームでは iOSAndroid 向けのアプリケーションも開発していて、ゆくゆくはクライアント側のコードも書けるようにしたいので積極的に取り組んだ。簡単な bugfix から始まり、レイアウトの微調整、環境(dev/stg/prd)毎の遷移先リンクの振り分け、画面遷移時に発生するエラーの調査修正などを行った。Python を触ったあとに Dart を書いたので、静的型付け良いなぁというのと、ドキュメントがすごく丁寧な印象をもった。関わる期間が短かったため深くは学んでいないが、まだプロジェクトは動いているので今後も機会があれば貢献したい。

チームの雰囲気とか

上長以外は初対面で、かつリモートのため馴染むのに時間がかかった。少しずつ慣れていった。 異動してから毎日夕会を実施していて、トレーニングや業務で詰まったときに画面共有しながら質疑応答してくれたのはよかった。 Slack での質問も快く回答してもらった。当時オレを除いたメンバーは 2 人いて、1 人はバックエンド開発に長けていて、もう 1 人はフロントエンドに長けている。上長は何でもできるって感じだったので、ほとんどの問題は質問することで解決できた。特に質問しづらいといった雰囲気は感じなかった。

困ったことは、開発フローやコーディングガイドがなかった点。どのような流れで PR を作成してレビュー依頼をするのか、Python のフォーマッターや Linter は何をつかうのかとか。あとはコードの書き方に統一感がなかったのも気になった。Lambda で API を書く場合は特に Web フレームワークを利用しない(コンテナ使えばできるが)ため、例えば共通処理はどのように切り出すかであったり、変数宣言時に型も明記するかなどが不明瞭だった。これらの問題は今後の課題。

直近のプロジェクトでは積極的にモブワークをした。素早く相談したり意思決定をしたかったり、コードレビュー時にお互いの認識が合わないといった場合に「モブりませんか?」と気軽に話せるのはよかった。話した内容は Wiki なり PR に明記するように心がけた。後で絶対に話した内容を忘れるので。VSCode やターミナル、Wiki を画面共有しながらあーでもないこーでもないとフラットに話せるのが心地よかった。画面共有は Gather を使った。常駐しているわけではないが、「いつもの部屋で」ができるのはとてもいい。Meet や Zoom だと都度ミーティングを払い出さないといけなくて手間だが、Gather は広いマップに複数の部屋があるイメージで他の人と被ったりすることもない。

www.gather.town

これからどうしていくのか

この 1 年はがっつりバックエンドをやってきたので、今後はフロントエンドもやっていきたい。 多くの場合、API はフロントエンドから叩かれてはじめて意味を成すため、フロントエンドを分かっていると、よりよい API を設計・実装できそうだと強く感じたから。 あとは、DynamoDB などの NoSQL もやっていきたい。関わったプロジェクトは RDBMS しか使っていないので、以降関わるプロジェクトでやっていきたい。

リリース作業も積極的に行った。まだまだ手作業な部分が多く、例えば DB のマイグレーションやサービスの動作確認、IAM ポリシーの権限修正などを手動で行っている。 人間なので手作業でやると必ずどこかでミスが発生する。挙げた手作業は全て自動化できる内容なので、開発初期の段階で自動化や IaC などを推進していきたい。 とはいえ開発中は機能の実装やバグ修正、打ち合わせなど様々なタスクに忙殺されることが多いので、日頃から検証しておくなどの素振りが必要。

インプット

読みきったものは少ないが、この 1 年は以下の書籍を読んだ(購入した)。

techbookfest.org

www.shoeisha.co.jp

gihyo.jp

www.oreilly.co.jp

www.oreilly.co.jp

gihyo.jp

gihyo.jp

www.seshop.com

www.shoeisha.co.jp

www.seshop.com

アウトプット

業務に関わるアウトプットはこれくらい。

enokawa.hatenablog.jp

enokawa.hatenablog.jp

enokawa.hatenablog.jp

おわりに

あまりまとまりがないが、インフラエンジニアからアプリケーションエンジニアへ転向した経緯ややってきたことをまとめた。 プログラミングの経験はかじる程度しかなかったが、この 1 年でフロントからバックエンド、インフラまで幅広く経験できて成長した実感がある。 まだまだ課題は山積みで、作りたいモノを作れるようにはなっていないが、こつこつやっていく。

2023年4月

育児

2 歳 5 ヶ月になった。

  • 桜を見に行った
  • いっぱい目薬さしたくて泣く
  • 夜めっちゃ起きる
    • のでいっぱい遊びまくった
    • 目悪くしそうだな。。
  • 夜中に起きてリビングまで歩いてきた
    • めっちゃビビった
    • 起きて誰もいなくて寂しかったのかな
    • 泣いてはいなかった
    • ATOM Cam の録画みたら上手にベッドから降りててドアもちゃんと閉めてて笑ってしまった
  • 新年度初の登園
    • 新しいお部屋やイスで戸惑っていたらしい
    • 徐々に慣れてくれるといいな
  • 園でトイレでおしっこできた
    • 家ではまだなので誘っていきたい
  • 歯医者でもらったドーナツの消しゴム食べれなくてキレた
  • 3 時のおやつ用にホットケーキを焼くようになった
    • 虫歯対策の一環
    • ゆくゆくは米粉とベーキングパウダーでやりたい
  • ホットケーキおとして食べれなくてギャン泣き
  • キッチン台に頭うって打撲
  • おもちゃに顎うってすりむいた
  • おくるみを卒業した
    • 歯医者で少し出っ歯気味と言われ卒業を決断
    • 生まれた時からずっと一緒だったので心が痛い
    • ホント息子氏に申し訳ない
  • ご飯食べる時の姿勢が悪い
    • ちゃんと座らせよう
    • ママパパも姿勢よく食べよう
  • 寝室にいきたがらない
    • おくるみ卒業したからかな
    • 寝つきも遅くなった
  • 寝起きに泣く
    • これもおくるみ卒業したからかな
  • お隣さん家族をお招きして遊んだ
    • ホットケーキ祭りと題した会だったけどお隣さんの子は食べず
    • おもちゃに集中してた
  • 車道に飛び出した
    • 運よく車は通ってなかった
    • 手を繋ぎたがらなかったので離してた油断した
    • 肝冷やした...気をつけよう
  • 園でシュシュつけてもらってそのまま降園した
  • 歯磨きの時「ウーイースーキー」って言ったらマネした
    • オレが昔受けたプレゼン研修で習った口角をあげる方法
    • キレイに歯が磨けるからありがたい
  • 歯磨き前に『はみがきれっしゃ』を持ってくる

今月のビッグニュースはついにおくるみを卒業したこと。生まれてから 2 年と 4 ヶ月、ほぼ常に身につけていて、ずっとおくるみと一緒に過ごしてきた。息子氏はおくるみがあると落ち着くらしく、寝る前や癇癪のときに与えると寝付いたり落ち着いたりする。そんな大切なものをたった一瞬で奪ってしまったのはとても心苦しかった。すべては親の都合で、息子氏にとって良いことなんてひとつもなかった。実際、歯並びに影響が出たり、これは定かではないが、発語に影響が出ていたとも思う。まだ十分に 2 語を話せていないので責任を感じている。

歯医者で指摘されてから、その後はおくるみを与えずに隠して昼寝につかせた。奥さんとも話して、このまま夜も与えずにいこうと決めた。その日はいつも寝付きのよい息子氏もなかなか寝付けなかった。寝る前はおくるみが必ずベッドに置いてあるから不安に思ったのだろう。そんな日が何日か続いて、最近ようやくおくるみなしでも落ち着いて寝付けるようになってきた。

何事も親の都合で解決するのは良くないなと痛感した。今日も疲れたから YouTube を観せて楽をしてしまった。これは短期的には、親にとっては楽になるかもしれない。ただ YouTube を観ているあいだ息子氏は言葉を殆ど発しない。つまり、親の都合で子どもの成長を妨げているということになる。そのことを忘れずにいたい。全ての労力を子どものために費やして生活するのはなかなか難しいが、うまくバランスをとって過ごしていきたい。例えば YouTube を観る時間を制限するなど。これは子どもにとってもそうだが、親にとっての制限にもなる。1 日 1 時間は YouTube を観せても/観てもよい。が、それ以外の時間はお絵かきをしたり、おもちゃで遊んだり、公園で遊んだりするといった具合で。

最終的には全部自分に返ってくるんだよな。将来「お父さんなんで僕は歯並びが悪いの?」「なんで YouTube ばっか観てちゃダメなの?」 「なんでゲームしてばっかじゃダメなの?」なんて言われたらオレは言い返すことはできるだろうか?できない。これ以上かくのはやめよう。。

仕事

その他

ブログ 2 件かいた

enokawa.hatenablog.jp

enokawa.hatenablog.jp

AWS KMSのエンベロープ暗号化を理解する

AWS Certified Security - Specialty の学習の一貫で KMS について勉強していた。 Black Belt を観て CLI を叩いたりしていて、GenerateDataKey APIユースケースが思い浮かばなかったので整理する。

前提

  • 対称暗号化 KMS キー(SYMMETRIC_DEFAULT)

処理の流れを整理

通常の Encrypt / Decrypt を利用した場合と、エンベロープ暗号化を利用した場合の流れを整理する。

Encrypt / Decrypt

特に手元に鍵を用意することなく、カジュアルに利用することが可能。 AWS CLI で Encrypt API を呼び出す際は、渡す平文(--plaintext)を事前に base64 エンコードしておく必要がある。 Decrypt API を呼び出す際は、返却された平文(Plaintext)を base64 デコードしてあげる。

  1. Encrypt API で CMK を利用しての平文を暗号化
  2. Decrypt API で CMK を利用して暗号データを復号

エンベロープ暗号化

Encrypt / Decrypt と比較すると手順が多い。暗号化と復号それぞれで手順をみていく。

暗号化

  1. GenerateDataKey API で CMK を利用して CDK を作成
    • データキーと暗号化されたデータキーを返す
  2. データキーを利用して任意の平文を暗号化
    • データキーはメモリ上に保持する
  3. 暗号化されたデータキーをディスクなどに保存
  4. データキーを削除

復号

  1. Decrypt API で CMK を利用して暗号化されたデータキーを復号
    • "暗号化"の 4 で保存したデータキーを送信
  2. 1 で返却されたデータキーを利用して暗号化されたデータを復号
    • データキーはメモリ上に保持する
  3. データキーを削除

Encrypt / Decrypt とエンベロープ暗号化の比較

簡単にまとめてみる。

Encrypt / Decrypt エンベロープ暗号化 備考
データ上限 4 KB なし
API 呼び出し頻度 多い 少ない
実装の容易さ △(※) ※ Encryption SDK 利用推奨
データキーの発行有無 なし あり
意図せず CMK が無効化もしくは削除された場合の影響

データ上限については分かりやすくて、4 KB 以上のデータを暗号化する必要がある場合はエンベロープ暗号化を利用せざるを得ない。API の呼び出し頻度については、Ecrypt / Decrypt の場合は都度呼び出す必要があるが、エンベロープ暗号化の場合は暗号化の処理を言語のライブラリ(Python だと cryptography など)で実装することができて、スロットリングが発生する可能性も低い。実装の容易さは Encrypt / Decrypt に軍配が上がるが、AWS から Encryption SDK というエンベロープ暗号化を簡単に実現できるライブラリが提供されている。Encryption SDK を利用することで、簡単に、かつ耐障害性のあるアプリケーションの実装が可能となる。

docs.aws.amazon.com

意図せず CMK が無効化もしくは削除された場合の影響について、CMK の場合はどうしようもないが、エンベロープ暗号化の場合はどうにかなる。仮に CMK が削除された場合、既にデータキーを発行している状態であれば引き続き暗号化は可能である。復号する場合どうすればいいのかはまだ理解できていないが、KMS のベストプラクティス(PDF)には DR の設計にも有用との記載があった。

どちらの方法を選択するにせよ、セキュアであることに変わりはなさそう。CMK の保守性であったり、可用性を高める場合はエンベローブ暗号化を使ったほうがよさそう。暗号化されたデータキーをどこに保持しておくかは検討する必要がありそう。どこにおいたほうがベストかはまだ分かっていないが、Encryption SDK では暗号化されたデータキーをキャッシングする機構もあるようだ。

ユースケース

雑に書くと、以下の条件に当てはまる場合はエンベロープ暗号化を利用したほうがよさそう。

  • 4 KB 以上のデータを暗号化する必要がある
  • バックエンドの Web API などで、多くのリクエストが見込まれる
    • 毎リクエストで暗号化する必要がある前提
  • 高可用性が求められる

具体的なユースケースは思い浮かばなかったが(ごめんなさい)、EC2 の EBS 暗号化でも、実際にエンベロープ暗号化を利用しているそう。高可用性が求められるサービスのため、エンベロープ暗号化を利用する必要があったといえる。

サンプルコード

実際にエンベロープ暗号化を実装したら理解が進んだ。合っているかどうか怪しいので参考までに。

github.com

参考

docs.aws.amazon.com

aws.amazon.com

docs.aws.amazon.com

qiita.com

stackoverflow.com

おわりに

GenerateDataKey API はどのようなユースケースで使うのだろうか。という疑問から、実際に実装しながら、ドキュメントを読みつつ理解を深められた。調べれば調べるほど KMS は奥が深くて、他の AWS サービスとも連携していて面白いなと感じた。KMS 完全に理解した。

今回は学習のため Encryption SDK は利用しなかったが、こんど実際に使ってみて便利さに驚愕したい。おそらくとても便利。