AWS Lambda: CLIで実行できないとき

  • 投稿日:
  • 更新日:2016/09/21
  • by
  • カテゴリ:

AWS Lambdaを使い始めて、しょうもないところで躓いたので、記録しておきます。

まず、Lambda Management Consoleから適当にblueprintを選んで(最初はhello-worldとかがいいでしょうね)関数を作成します。初回は、途中でロールを作ったりしなければいけないので若干面倒ですが、作成自体は大したことはありません。

作成後、テストで"Hello World"というテンプレートを選んで実行すればそれなりの結果が得られます。

Lambda-test.pngLambda実行の様子

はまりポイントはCLIに

AWS登録したてほやほやの私がLambda Management Console、つまりWebブラウザ上から大した問題もなく実行ができたので、気を良くしてCLI (Command Line Interface)を使って手元の環境から実行してみることにしました。

CLIのインストール、設定を済ませ、関数リストを取ってみます。

$ aws configure
AWS Access Key ID []: ********************
AWS Secret Access Key []: ********************
Default region name []: ap-northeast-1
Default output format [None]: json

なお、ファイアウォール環境内から実行する場合は環境変数HTTP_PROXY, HTTPS_PROXYの設定も必要です。

$ export HTTP_PROXY=http://user:pass@proxy.example.com:8080
$ exportHTTPS_PROXY=http://user:pass@proxy.example.com:8080

さて、ここから関数のリストを取ってみます。

$ aws lambda list-functions
{
"Functions": []
}
$

?! 何も出てきません。

Webを見るとこのlist-functionsに--profileオプションをつけたりいろいろ例があるので試してみましたが、どれも効果なし。

そのとき気づいたのが「AWSの各機能はリージョンごとに管理されている」ということ。つまり、世界に何か所もあるAWSのデータセンタごとに様々なサービスがあり、個別に管理されているということです。

先ほどWebブラウザの右上に表示されていたリージョンを確認すると...。

Lambda-region.pngリージョンがus-east-1 (N. Virginia)!

北米になっているではありませんか。CLIのインストール時に、使うリージョンは東京がいいかなと"ap-northeast-1"を指定していましたが、これが合ってないのが原因でした。AWSのサインアップか何かの時に東京にしたつもりだったんだけど...??

これを修正します。Lambda CLIの設定ファイルは~/.awsに入っており、以下の2ファイルです。

$ cat ~/.aws/config
[default]
output = json
region = ap-northeast-1
$ cat ~/.aws/credentials
[default]
aws_access_key_id = ********************
aws_secret_access_key = ****************************************

赤色下線部のap-northeast-1が動作しなかった原因なので、これを"us-east-1"に修正します。

$ aws lambda list-functions
{
"Functions": [
{
"Version": "$LATEST",
"CodeSha256": "****************************************",
"FunctionName": "hello-world_python",
"MemorySize": 128,
"CodeSize": 373,
"FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:hello
-world_python",
"Handler": "lambda_function.lambda_handler",
"Role": "arn:aws:iam::123456789012:role/service-role/myrole",
"Timeout": 3,
"LastModified": "2016-07-13T00:00:00.000+0000",
"Runtime": "python2.7",
"Description": "A starter AWS Lambda function."
}
]
}

今度は無事に内容が返ってきました。

$ aws lambda invoke --function-name hello-world_python --payload '{"key3":"value3","key2":"value2","key1":"value1"}' output.txt
{
"StatusCode": 200
}
$ cat output.txt
"value1"

実行も問題ありません。

というわけで、リージョン間違いに気をつけましょうというお話でした。

こちらもよく読まれています