AWS CLIからLambda FunctionをアップロードしTwitterにTweetしてみた

今日はLambda FunctionをCLIからアップロードし、TwitterTweetしてみた時のログを晒します。
久々にまじめに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が追加されていることを確認できるでしょう。

f:id:demiglacesource:20160424012858j:plain

Lambda Functionを実行

ではいよいよLambda Functionを実行します。

# aws lambda invoke --function-name lambda-twitter output.txt
{
    "StatusCode": 200
}

どうやら実行に成功したようです。
正しくTwitterにも投稿されていることが確認できますね。

f:id:demiglacesource:20160424013112j:plain

何度か実行すると、Management Consoleからもそれらしい実行ログを確認できるようになりました。
(何度かエラーになっているのは・・・察してください)

f:id:demiglacesource:20160424013429j:plain

まとめ

Lambda Functionの作成から実行までを、AWS CLIを用いて行ってみました。
次回は今回作成したLambda FunctionをAPI Gateway経由で実行してみたいと思います!