AWS Lambda関数の特定バージョンのコードをダウンロードする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Lambdaは2015年の10月からバージョン管理機能に対応し、この機能を有効化すると、コードをバージョン管理できるようになりました。

残念なことに、Lambda関数をバージョン管理しても、管理コンソールからは最新版のコードしか取得出来ません。 そこで今回は、コマンドライン(AWS CLI)からバージョン・エイリアスを指定してLambda関数をダウンロードする方法を紹介します。

バージョン管理されたLambda関数

例として、バージョン管理された Lambda 関数 "test" に対して

  • 3
  • 4
  • $LATEST

の版が存在し、エイリアスとして「prod」が版「3」を指しているとします。

lambda versioning

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関数をアップロードしたら、版管理すること
  • 版管理時には、適切な修正メッセージを残し、バージョン一覧をざっと眺めただけで、変更内容がわかるようにすると

を心がけておくと、「もしも」のときに慌てずに済むかもしれません。