BioErrorLog Tech Blog

試行錯誤の記録

Lambdaコンソールでコードが読めない時の対処法 | too large to enable inline code editing

The deployment package of your Lambda function XXX is too large to enable inline code editing. However, you can still invoke your function.

Lambdaコンソールにて上記のエラーが出てコードが読めない時に、コードを取得する方法をメモします。

はじめに

こんにちは@bioerrorlogです。

Lambdaにサイズの大きいコードをアップロードすると、以下のエラーが出てコンソール上でコードが確認できなくなります。

The deployment package of your Lambda function XXX is too large to enable inline code editing. However, you can still invoke your function.

ドキュメントを確認すると、コードサイズが3MBを超えた場合にコンソール上でコードが確認できなくなることが分かります。

Deployment package (.zip file archive) size quota: 3 MB (console editor), 512 KB maximum for an individual file

依存パッケージごとzipにした場合など、3MBは超えてしまうことが多いでしょう。


自分で作成したコードであれば、Lambdaコンソール上でコードが見れなくてもソースを確認すればよいかもしれません。

しかし、例えばAWS Solutions Libraryを使ってLambdaがデプロイされた場合など、自分でコードを書いていない場合はコンソール上でコードが読めないと少し厄介です。

今回は、Lambdaコンソールでコードが確認できないときでも使える、コマンドでLambdaコードを取得する方法をメモします。

Lambdaコードを取得する

コマンドでLambdaコードを取得する

まず結論、以下のコマンドでLambdaコードが取得できます。

aws lambda get-function --function-name <function名> --query 'Code.Location' | xargs curl -o <出力ファイル名>

例えば、function_aという名前のLambdaのコードをcode.zipという名前で取得するには、以下のコマンドを実行します。

aws lambda get-function --function-name function_a --query 'Code.Location' | xargs curl -o code.zip

コマンド解説

ではコマンドの処理内容を見ていきます。

まずはじめに、AWS CLIのget-functionコマンドを実行してLambdaの情報を取得します。

aws lambda get-function --function-name <function名>

--queryオプションを使わずにget-functionコマンドでLambda情報全体を取得した場合、例えば以下のような出力が得られます。

{
    "Concurrency": {
        "ReservedConcurrentExecutions": 100
    },
    "Code": {
        "RepositoryType": "S3",
        "Location": "https://awslambda-us-west-2-tasks.s3.us-west-2.amazonaws.com/snapshots/123456789012/my-function..."
    },
    "Configuration": {
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "Version": "$LATEST",
        "CodeSha256": "5tT2qgzYUHoqwR616pZ2dpkn/0J1FrzJmlKidWaaCgk=",
        "FunctionName": "my-function",
        "VpcConfig": {
            "SubnetIds": [],
            "VpcId": "",
            "SecurityGroupIds": []
        },
        "MemorySize": 128,
        "RevisionId": "28f0fb31-5c5c-43d3-8955-03e76c5c1075",
        "CodeSize": 304,
        "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
        "Handler": "index.handler",
        "Role": "arn:aws:iam::123456789012:role/service-role/helloWorldPython-role-uy3l9qyq",
        "Timeout": 3,
        "LastModified": "2019-09-24T18:20:35.054+0000",
        "Runtime": "nodejs10.x",
        "Description": ""
    }
}

この出力結果のうち、Code内のLocationにてLambdaコードの配置場所が記されています。

--queryオプションを用いることで、このLambdaコードの配置場所Code.Locationのみを出力するようフィルタリングすることが出来ます。

aws lambda get-function --function-name <function名> --query 'Code.Location'


次に、得られたLambdaコード配置場所のURLをパイプ|xargsコマンドに渡し、curlコマンドを実行しています。

 | xargs curl -o <出力ファイル名>

xargsコマンドは、標準入力等から値を読み込んで別のコマンドを実行させることが出来るコマンドです。 Lambdaコード配置場所のURLをxargsコマンドでcurlコマンドに渡し、GETリクエストを送ります。

得られたレスポンスの内容(Lambdaコード)は、-oオプションで指定したファイル名で保存されます。


以上のようにして、Lambdaコードをコマンドで取得することが可能です。

おわりに

今回は、コマンドでLambdaコードを取得する方法をメモしました。

AWSマネジメントコンソールは手軽に利用できますが、要所要所で制約が気になることも多くあります。 APIやコマンドも上手く活用して、円滑なAWSライフを送りたいものです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

参考

Lambda quotas - AWS Lambda

get-function — AWS CLI 1.25.2 Command Reference

How to check what code is currently running in your lambda when UI Console does not allow viewing or editing it - DEV Community