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ライフを送りたいものです。
[関連記事]