AWS Lambdaを使い始めて、しょうもないところで躓いたので、記録しておきます。
まず、Lambda Management Consoleから適当にblueprintを選んで(最初はhello-worldとかがいいでしょうね)関数を作成します。初回は、途中でロールを作ったりしなければいけないので若干面倒ですが、作成自体は大したことはありません。
作成後、テストで"Hello World"というテンプレートを選んで実行すればそれなりの結果が得られます。
はまりポイントは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ブラウザの右上に表示されていたリージョンを確認すると...。
リージョンが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"
実行も問題ありません。
というわけで、リージョン間違いに気をつけましょうというお話でした。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!