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
{
"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 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