AWS CLIからLambda FunctionをアップロードしTwitterにTweetしてみた
今日はLambda FunctionをCLIからアップロードし、TwitterにTweetしてみた時のログを晒します。
久々にまじめにLambdaを触っているので、記憶を呼び起こす+自分への自戒を込めて、ブログ記事化してみました。
事前準備
まずは作業フォルダを作成しましょう。
# mkdir lambda-twitter && cd $_
TwitterへのTweetは毎度おなじみのこちらのライブラリを利用しました。
# npm install twitter
Lambda Function
続いて実際のLambda Functionです。今回は特にパラメータなどは受け取らず、固定の文字列で「I Love Twitter」とつぶやいてみました。
はい、ほとんどtwitterライブラリのサンプルをそのままLambda Function化してみた、というのが実態です。
# vim index.js
var Twitter = require('twitter');
var client = new Twitter({
consumer_key: 'xxxxxxxxxxxxxxxxxxxxxxxxx',
consumer_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
access_token_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
access_token_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
});
exports.handler = function(event, context) {
client.post('statuses/update', {status: 'I Love Twitter'}, function(error, tweet, response){
if (error) {
context.done(null, error);
}
console.log(tweet);
console.log(response);
context.succeed();
});
};
Lambda Functionを圧縮
twitterライブラリを利用するため、zip形式で圧縮してアップロードします。
そのため先ほど作成したLambda Functionを、zipで圧縮しましょう。
# zip -r lambda-twitter.zip index.js node_modules
IAM Roleの作成
Lambda Functionに紐付けるIAM Roleを作成します。
今回はこちらもCLIから実行してみましょう。
# mkdir roles
# vim roles/lambda-exec-role.json
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
# aws iam create-role --role-name lambda-exec-role --assume-role-policy-document file://roles/lambda-exec-role.json
{
"Role": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
]
},
"RoleId": "xxxxxxxxxxxxxxxxxxxxx",
"CreateDate": "2016-04-23T14:45:34.538Z",
"RoleName": "lambda-exec-role",
"Path": "/",
"Arn": "arn:aws:iam::xxxxxxxxxxxx:role/lambda-exec-role"
}
}
Lambda Functionを作成
先ほど作成したzipファイル、およびIAM Roleを指定しLambda Functionを作成します。
# aws lambda create-function --function-name lambda-twitter --runtime nodejs --role arn:aws:iam::xxxxxxxxxxxx:role/lambda-exec-role --handler index.handler --zip-file fileb://lambda-twitter.zip
{
"CodeSha256": "ZdOQM2MN4GaYNU8MZa4s2wh4Ya195b2KryMf7oEhFq8=",
"FunctionName": "lambda-twitter",
"CodeSize": 1273693,
"MemorySize": 128,
"FunctionArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:lambda-twitter",
"Version": "$LATEST",
"Role": "arn:aws:iam::xxxxxxxxxxxx:role/lambda-exec-role",
"Timeout": 3,
"LastModified": "2016-04-23T15:29:40.632+0000",
"Handler": "index.handler",
"Runtime": "nodejs",
"Description": ""
}
Management Consoleを見ると、作成したLambda Functionが追加されていることを確認できるでしょう。
Lambda Functionを実行
ではいよいよLambda Functionを実行します。
# aws lambda invoke --function-name lambda-twitter output.txt
{
"StatusCode": 200
}
どうやら実行に成功したようです。
正しくTwitterにも投稿されていることが確認できますね。
何度か実行すると、Management Consoleからもそれらしい実行ログを確認できるようになりました。
(何度かエラーになっているのは・・・察してください)
まとめ
Lambda Functionの作成から実行までを、AWS CLIを用いて行ってみました。
次回は今回作成したLambda FunctionをAPI Gateway経由で実行してみたいと思います!