📑
S3イベントをEvent bridge経由で別アカウントへ伝える
やりたいこと
本番環境AへのS3へのイベント時に開発環境BのLambdaを起動したい。
作った構成
こちらの記事を参考にさせていただきました。
具体的な作成手順については、上記の記事を参考にしてください。上記の記事に対する補足事項を記載させていただきます。
手順
- 開発環境のターゲットとなるSQSとLambdaを作成
- 開発環境のEvent-busのアクセス許可に、本番環境アカウントを追加。
- イベントパターンはいったん、本番環境アカウントのすべてのイベントとする。
- ターゲットに開発環境のSQSを指定
- 本番環境のイベントバスへ通知を送りたいバケットのイベント通知を設定する。
↓のように、Event-bridgeをONにするだけです。
- 本番環境のEvent-busから開発環境のEvent-busへイベントを送るためのルールを作成
イベントパターンはシンプルに、S3の全イベントとしました。
- Event-busのRoleは自動で新しく作成させる
- ターゲットで、開発環境のEvent-busのArnを指定
Cloudformationで作る
全リソースをCloudformationで作ることはまだやっていませんが、開発環境のEvent-busのRuleをCloudformationで作ってみたので載せます。
参考にさせていただいたサイトはこちら
AWSTemplateFormatVersion: "2010-09-09"
Resources:
EventBusPolicy:
Type: AWS::Events::EventBusPolicy
Properties:
EventBusName: default
StatementId: EventFromProdS3Event
Principal: "本番環境のアカウントID"
Action: events:PutEvents
EventForwardingSQSRule:
Type: AWS::Events::Rule
Properties:
Name: SAMPLE
Description: sample
State: ENABLED
EventBusName: default
EventPattern:
account:
- "アカウント番号"
detail:
bucket:
name:
- バケット名
Targets:
- Id: 1
Arn: SQSのARN
LambdaEvent:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName: Lambdaの関数名
Principal: events.amazonaws.com
SourceArn: Event ruleのArn
2021/12/21追記
- EventPatternでアカウント番号に加え、バケット名でもフィルタリングをできるようにしました。バケット名もリスト形式で書かなければいけない点が注意点です。
- LambdaEventにEventBridgeを許可する設定も追記しました。下の画像のようにLambdaのポリシーステートメントにEventBridgeからのInvokeを許可するように設定されます。
Event-busの名前で最初にdefaultというものがつくられているので、そのdefaultを使用しています。
2021/12/22追記
LambdaがAssumeRoleできる権限を持っていても、boto3で実際にAPIをたたく際にはAssumeRoleすると明示的に宣言する必要があります(宣言しないとAccessDenied)。
実装方法はクラスメソッドさんの記事をご参考されてください。
求む
開発環境にカスタムEvent-busを作って同じような設定をしたのですが、カスタムEvent-busがイベントを受け取っていないようでした。defaultだと設定で来たのに、カスタムだとできなくなるのが分からないです。分かる方いたら教えてください
以上です。
Discussion