Amazon S3経由でULしたAWS Lambdaの関数コードをSHA256で検証する
先日書いた記事(Serverless Framework+Java+GradleでS3に配置したパッケージからAWS Lambda関数をデプロイしてみた)で、Serverless Frameworkを利用してS3に配置したファイルを利用してAWS Lambdaの関数コードを更新する方法をご紹介しました。
今回は、それに少し関連して、S3に配置したファイルを利用して更新した関数コードの検証方法をご紹介します。
具体的には、S3に配置したファイルのSHA256とAWS Lambdaの関数コードのSHA256を比較して検証してみたので、やってみたことを書きます。
はじめに
環境
$ sw_vers ProductName: Mac OS X :
概要
- AWS Lambdaの関数コードの コードSHA-256 (図を参照) の値を利用して検証を行う
- コード SHA-256は、CLIでも確認することができる。get-functionの実行結果のCodeSha256の値
- コードSHA-256の値は、デプロイパッケージのアーカイブファイルのSHA256を計算しbase64エンコードすれば求めることができる
- デプロイパッケージのSHA256はローカルで計算する
- 計算したSHA256の値(base64形式)は、アップロードしたオブジェクトのタグに設定する。後から比較しやすいため
- 今回はJava8のランタイムで動作するコードを使う
やってみたこと
デプロイパッケージとLambda関数の用意
こちら( Java 関数の ZIP デプロイパッケージの作成 )の仕様を踏まえつつ、AWS Lambdaで動作するJavaのデプロイパッケージを適当に用意しました。
また、デプロイパッケージの内容を適用する先のLambda関数を用意しました。 ちなみに今回のようなテスト用の関数をゼロベースでかつ単発で作る場合には、下図のように個人的にはマネジメントコンソールから作成するのが一番少ステップです。CLIですとロールの設定が少し煩雑になりますので。(事前にCDKとかCFnのテンプレートとか、デプロイツールが設定されているならそれが一番いいですけどね)
Key | Value |
---|---|
S3バケット名 | katoaki-blog |
Lambda関数名 | validation-test |
SHA256の計算
以下のコマンドでデプロイパッケージのSHA256を計算しました
$ openssl dgst -binary -sha256 /LocalPath/To/hello.zip | base64 PPCt????????????????????????????????????5jM=
Amazon S3へのアップロード
以下のコマンドでデプロイパッケージをAmazon S3上へアップロードしました
$ aws s3 cp /LocalPath/To/hello.zip s3://katoaki-blog/200401/hello.zip
タグの設定
以下のコマンドで、先程確認したSHA256をデプロイパッケージのタグにセットしました
$ aws s3api put-object-tagging \ --bucket katoaki-blog \ --key 200401/hello.zip \ --tagging "TagSet=[{Key=sha256,Value=PPCt????????????????????????????????????5jM=}]"
Lambdaの関数コードの更新
更新の前に、まずはデプロイパッケージのSHA256とLambdaの関数コードのSHA256が違っていることを確認しておきます。
$ aws s3api get-object-tagging \ --bucket katoaki-blog \ --key 200401/hello.zip { "TagSet": [ { "Key": "sha256", "Value": "PPCt????????????????????????????????????5jM=" } ] }
$ aws lambda get-function \ --function-name validation-test \ | grep "CodeSha256" "CodeSha256": "+5OF????????????????????????????????????oUw=",
確認後、Lambda関数コードを更新します。
$ aws lambda update-function-code \ --function-name validation-test \ --s3-bucket katoaki-blog \ --s3-key 200401/hello.zip
{ "FunctionName": "validation-test", : "CodeSha256": "PPCt????????????????????????????????????5jM=", : }
比較
以下のコマンドで一致しているかどうか比較してみます。
$ aws s3api get-object-tagging \ --bucket katoaki-blog \ --key 200401/hello.zip { "TagSet": [ { "Key": "sha256", "Value": "PPCt????????????????????????????????????5jM=" } ] }
$ aws lambda get-function \ --function-name validation-test \ | grep "CodeSha256" "CodeSha256": "PPCt????????????????????????????????????5jM=",
確認できました!
さいごに
AWS Lambdaの関数コードをSHA256で検証する一つの方法をご紹介しました。 すべてのプロセスがCLIで処理できますので、既存のデプロイのフローにも組み込みやすい方法かと思います。 誰かの参考になれば幸いです。