起因:在多個region用cloudwatch即時監控相關資訊,並將需要的資訊拋進slack/line。但又因為cloudwatch只能呼叫自己region內的sns/lambda,因此想說看可不可以跨region or account去做呼叫,這樣我的lambda只需要maintain一隻就夠。
爬了一些地方,都沒看到解法
後來詢問了專業的,說可以用cli去控制lambda的權限讓他cross region呼叫
因此調整了估狗關鍵字後找到了這篇文章
謝謝這位高手讓我終於搞定這件事。
以下針對上面玩完後做些筆記:
目前情境:lambda在Tokyo,要讓Virginia的sns可以呼叫
lambd@tokyo先建立好
1. 在Virginia建一個sns topic
aws sns create-topic --name aws-check-info --region "us-east-1"
region要指定喔~ 不然他會跑去aws configure裡面預設的region
按下enter後會回傳
{
“TopicArn”: “arn:aws:sns:us-east-1:11111111:aws-check-info”
}
2. 給這個sns權限
aws sns add-permission --topic-arn arn:aws:sns:us-east-1:11111111:aws-check-info --label lambdaAccess --aws-account-id 11111111 --action-name Subscribe ListSubscriptionsByTopic Receive --region "us-east-1"
若語法正確,按下enter後就結束這回合(對,沒有任何回傳的東西)
簡單翻譯一下上面指令
在sns add-permission中必填參數有四個
* topic-arn:要開權限改哪個arn
* label:一個標籤(隨便打)
* aws-account-id:你要開給哪一個account-id做使用(因為是開給自己的另外region用,所以是自己的account-id)
* action-name:開什麼權限
region:這個sns所在的region
3. 在lambda裡面加權限
aws lambda add-permission --function-name "system-alert-to-slack" --statement-id "Lambda-system-alert-to-slack-us-east-1" --action "lambda:InvokeFunction" --principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-1:11111111:aws-check-info --region "ap-northeast-1"
再來翻譯一下指令 lambda cli可以看這裡
在lambda add-permission也有四個必填參數
* function-name:要呼叫的lambda function name
* statement-id:隨便key的一個key值
* action:可以授權給人家lambda的什麼權限
* principal:誰可以拿到這個permission(以此範例就是sns阿)
region:指的是這個lambda的region喔~
按下enter後會回傳
{
"Statement": "{\"Sid\":\"Lambda-system-alert-to-slack-us-east-1\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:11111111:function:system-alert-to-slack\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:sns:us-east-1:11111111:aws-check-info\"}}}"
}
我之前就在lambda add-permission這裡卡很久
終於過關趕快寫下來XD
4. create sns subscribe
aws sns subscribe --topic-arn arn:aws:sns:us-east-1:11111111:aws-check-info --protocol lambda --notification-endpoint arn:aws:lambda:ap-northeast-1:11111111:function:system-alert-to-slack --region "us-east-1"
再來翻譯一下指令
在sns subscribe有二個必填參數
* topic-arn:咱們sns的arn
* protocol:lambda(指的是要用什麼方式傳送這個訊息)
notification-endpoint:要引用的lambda的arn(這個
回傳這個表示搞定
{
"SubscriptionArn": "arn:aws:sns:us-east-1:518375879370:aws-check-info:6b35cdaa-d5f0-4ecc-8594-33918e67a1e7"
}
以上,終於搞定
謝謝收看~
是說aws新手上路,問題蠢蠢請各看官多多包涵 😄
有錯也煩請指正