Amazon S3経由でULしたAWS Lambdaの関数コードをSHA256で検証する

2020.04.01

先日書いた記事(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で処理できますので、既存のデプロイのフローにも組み込みやすい方法かと思います。 誰かの参考になれば幸いです。