AWS Lambda関数の特定バージョンのコードをダウンロードする
AWS Lambdaは2015年の10月からバージョン管理機能に対応し、この機能を有効化すると、コードをバージョン管理できるようになりました。
残念なことに、Lambda関数をバージョン管理しても、管理コンソールからは最新版のコードしか取得出来ません。 そこで今回は、コマンドライン(AWS CLI)からバージョン・エイリアスを指定してLambda関数をダウンロードする方法を紹介します。
バージョン管理されたLambda関数
例として、バージョン管理された Lambda 関数 "test" に対して
- 3
- 4
- $LATEST
の版が存在し、エイリアスとして「prod」が版「3」を指しているとします。
Lambda 関数のバージョニング・エイリアス機能については、次のページをご確認ください。 http://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html
重要な API
今回の操作では重要なAPIが2つあります。
1. list-versions-by-function
Lambda 関数のバージョン一覧を取得するAPIです。
更新日時(LastModified
)や修正メッセージ(Description
)も確認できます。
2. get-function
Lambda 関数を取得するAPIです。
--qualifier
オプションでバージョンやエイリアス名を指定します。
実際にはコードを ZIP化したS3オブジェクトのpre-signed URLが返されます。
バージョンを指定してLambda関数コードを取得
バージョン一覧の確認
コマンドラインから、Lambda 関数に定義された版を確認して見ましょう。
API list-versions-by-function
を使います。
$ aws lambda list-versions-by-function --function-name test { "Versions": [ { "Version": "$LATEST", "CodeSha256": "G/KqjHsn0MHuKQTx3eTxDI8hntIjhECyFVoYHnobOHA=", "FunctionName": "test", "MemorySize": 128, "CodeSize": 231, "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test:$LATEST", "Handler": "index.handler", "Role": "arn:aws:iam::123456789012:role/lambda_basic_execution", "Timeout": 3, "LastModified": "2016-01-18T13:54:26.346+0000", "Runtime": "nodejs", "Description": "add hello func" }, { "Version": "3", "CodeSha256": "hkvw5v7bTlylsJpn7wvkKKaX/+dkz2/k9VV584HAAmU=", "FunctionName": "test", "MemorySize": 128, "CodeSize": 231, "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test:3", "Handler": "index.handler", "Role": "arn:aws:iam::123456789012:role/lambda_basic_execution", "Timeout": 3, "LastModified": "2016-01-18T13:40:35.425+0000", "Runtime": "nodejs", "Description": "initial version" }, { "Version": "4", "CodeSha256": "I6BRhWsxwn4YLrNKE04l4Z+g+WQeTxzfu92pMxlLZsc=", "FunctionName": "test", "MemorySize": 128, "CodeSize": 231, "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test:4", "Handler": "index.handler", "Role": "arn:aws:iam::123456789012:role/lambda_basic_execution", "Timeout": 3, "LastModified": "2016-01-18T13:52:44.600+0000", "Runtime": "nodejs", "Description": "change conf" } ] }
--query
で出力情報を絞ることもできます。
$ aws lambda list-versions-by-function --function-name test --query 'Versions[*].[Version, Description, LastModified]' [ [ "$LATEST", "add hello func", "2016-01-18T13:54:26.346+0000" ], [ "3", "initial version", "2016-01-18T13:40:35.425+0000" ], [ "4", "change conf", "2016-01-18T13:52:44.600+0000" ] ]
コードをダウンロード
get-function
API でLambda 関数のコードを取得します。
--qualifier
に続けてバージョン番号を指定します。
$ aws lambda get-function --function-name test --qualifier 3 { "Code": { "RepositoryType": "S3", "Location": "https://awslambda-ap-ne-1-tasks.s3-ap-northeast-1.amazonaws.com/snapshots/123456789012/test-22222222-3cca-4395-bc50-000000000000?x-amz-security-token=LONG-PARAMETER" }, "Configuration": { "Version": "3", "CodeSha256": "hkvw5v7bTlylsJpn7wvkKKaX/+dkz2/k9VV584HAAmU=", "FunctionName": "test", "MemorySize": 128, "CodeSize": 231, "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test:3", "Handler": "index.handler", "Role": "arn:aws:iam::123456789012:role/lambda_basic_execution", "Timeout": 3, "LastModified": "2016-01-18T13:40:35.425+0000", "Runtime": "nodejs", "Description": "initial version" } } $ curl -o test-v3.zip "https://awslambda-ap-ne-1-tasks.s3-ap-northeast-1.amazonaws.com/snapshots/123456789012/test-22222222-3cca-4395-bc50-000000000000?x-amz-security-token=LONG-PARAMETER"
エイリアスを指定してLambda関数コードを取得
API get-alias
でエイリアス「prod」の実態を確認して見ましょう。
$ aws lambda get-alias --function-name test --name prod { "AliasArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test:prod", "FunctionVersion": "3", "Name": "prod", "Description": "lambda for production" }
レスポンスのFunctionVersion
からバージョン3であることがわかります。
API get-function
の --qualifier
にエイリアスを渡すと、対応するコードのURLを取得できます。
$ aws lambda get-function --function-name test --qualifier prod { "Code": { "RepositoryType": "S3", "Location": "https://awslambda-ap-ne-1-tasks.s3-ap-northeast-1.amazonaws.com/snapshots/123456789012/test-33333333-3cca-4395-bc50-999999999999?x-amz-security-token=LONG-PARAMETER" }, "Configuration": { "Version": "3", "CodeSha256": "hkvw5v7bTlylsJpn7wvkKKaX/+dkz2/k9VV584HAAmU=", "FunctionName": "test", "MemorySize": 128, "CodeSize": 231, "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test:prod", "Handler": "index.handler", "Role": "arn:aws:iam::123456789012:role/lambda_basic_execution", "Timeout": 3, "LastModified": "2016-01-18T13:40:35.425+0000", "Runtime": "nodejs", "Description": "initial version" } }
レスポンスの Configuration->Version
からエイリアス「test」の実態がバージョン3であることもわかります。
レスポンスのCode->Location
にある URLを叩けば、コードを取得できます。
最新のコードを取得
API get-alias
から --qualifier
オプションを省略すると、最新のコードを取得できます。
つまり、次の2つはともに最新(バージョンが「$LATEST」)のコードを取得します。
$ aws lambda get-function --function-name test $ aws lambda get-function --function-name test --qualifier '$LATEST'
まとめ
今回はバージョンやエイリアスを指定してLambda関数のコードを取得する方法を紹介しました。
版管理は最近追加された機能のため、有効活用されていないLambda関数がたくさんあるかもしれません。 版管理してしまえば、コードはあとから復元できます。
- 新しいLambda関数をアップロードする前に、既存のLambda関数を版管理しておくこと
- 新しいLambda関数をアップロードしたら、版管理すること
- 版管理時には、適切な修正メッセージを残し、バージョン一覧をざっと眺めただけで、変更内容がわかるようにすると
を心がけておくと、「もしも」のときに慌てずに済むかもしれません。