この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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関数をアップロードしたら、版管理すること
- 版管理時には、適切な修正メッセージを残し、バージョン一覧をざっと眺めただけで、変更内容がわかるようにすると
を心がけておくと、「もしも」のときに慌てずに済むかもしれません。