{Lambda}チュートリアル: Amazon Simple Notification Service での AWS Lambda の使用

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sns-example.html


-- 1. コマンド等のインストール

-- 1.1 aws cli version 2 インストール

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

aws --version

-- 1.2 jqインストール
sudo yum -y install jq


-- 2. Amazon SNS トピックを作成する[アカウントA]
aws sts get-caller-identity


aws sns create-topic --name topic01
aws sns list-topics


-- 3. 実行ロールを作成する[アカウントB]
aws sts get-caller-identity

vim role01.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json


-- 4. ポリシーをロールにアタッチ[アカウントB]
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole \
--role-name role01


-- 5. Lambda 関数を作成する[アカウントB]

vim test.js

console.log('Loading function');

exports.handler = function(event, context, callback) {
// console.log('Received event:', JSON.stringify(event, null, 4));

    var message = event.Records[0].Sns.Message;
    console.log('Message received from SNS:', message);
    callback(null, "Success");
};

chmod 755 test.js
zip test.zip test.js

 

aws lambda create-function \
--function-name func01 \
--zip-file fileb://test.zip \
--handler test.handler \
--runtime nodejs12.x \
--timeout 60 \
--memory-size 1024 \
--role arn:aws:iam::888888888888:role/role01

aws lambda list-functions | grep func01
aws lambda get-function --function-name func01

-- 6. クロスアカウント許可をセットアップする

-- 6.1 トピックにサブスクライブする許可をアカウントBに付与します。[アカウントA]

aws sns add-permission \
--label lambda-access \
--aws-account-id 888888888888 \
--topic-arn arn:aws:sns:ap-northeast-1:999999999999:topic01 \
--action-name Subscribe ListSubscriptionsByTopic

aws sns get-topic-attributes \
--topic-arn arn:aws:sns:ap-northeast-1:999999999999:topic01


-- 6.2 Amazon SNS からの呼び出しを許可する Lambda 許可を追加します。[アカウントB]

aws lambda add-permission \
--function-name func01 \
--statement-id function-with-sns \
--action "lambda:InvokeFunction" \
--principal sns.amazonaws.com \
--source-arn arn:aws:sns:ap-northeast-1:999999999999:topic01

aws lambda get-policy \
--function-name func01 | jq -r .Policy  | jq .

-- 7. サブスクリプションを作成する[アカウントB]

aws sns list-subscriptions

 

aws sns subscribe \
--protocol lambda \
--topic-arn arn:aws:sns:ap-northeast-1:999999999999:topic01 \
--notification-endpoint arn:aws:lambda:ap-northeast-1:888888888888:function:func01


-- 8. サブスクリプションをテストする[アカウントA]

echo "Hello World" > message.txt


aws sns publish \
--message file://message.txt \
--subject Test \
--topic-arn arn:aws:sns:ap-northeast-1:999999999999:topic01


アカウントBのLambda関数が動作したことをログから確認


-- 9. クリーンアップ


-- SNSサブスクリプション削除[アカウントB]
aws sns list-subscriptions
aws sns unsubscribe --subscription-arn arn:aws:sns:ap-northeast-1:999999999999:topic01:11111111-2222-3333-4444-555555555555

 

-- Lambda関数の削除[アカウントB]
aws lambda get-function --function-name func01
aws lambda delete-function --function-name func01

 

-- ロールの削除[アカウントB]
aws iam list-roles | grep role01

aws iam detach-role-policy \
--role-name role01 \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

aws iam delete-role --role-name role01

 

-- SNSトピック削除[アカウントA]
aws sns list-topics
aws sns delete-topic --topic-arn arn:aws:sns:ap-northeast-1:999999999999:topic01