📑

S3イベントをEvent bridge経由で別アカウントへ伝える

2021/12/20に公開

やりたいこと

本番環境AへのS3へのイベント時に開発環境BのLambdaを起動したい。

作った構成

こちらの記事を参考にさせていただきました。
https://dev.classmethod.jp/articles/issue-an-event-to-the-event-bus-of-eventbridge-of-anotheraccount/

具体的な作成手順については、上記の記事を参考にしてください。上記の記事に対する補足事項を記載させていただきます。

手順

  1. 開発環境のターゲットとなるSQSとLambdaを作成
  2. 開発環境のEvent-busのアクセス許可に、本番環境アカウントを追加。
  3. イベントパターンはいったん、本番環境アカウントのすべてのイベントとする。
  4. ターゲットに開発環境のSQSを指定
  5. 本番環境のイベントバスへ通知を送りたいバケットのイベント通知を設定する。
    ↓のように、Event-bridgeをONにするだけです。
  6. 本番環境のEvent-busから開発環境のEvent-busへイベントを送るためのルールを作成
    イベントパターンはシンプルに、S3の全イベントとしました。
  7. Event-busのRoleは自動で新しく作成させる
  8. ターゲットで、開発環境のEvent-busのArnを指定

Cloudformationで作る

全リソースをCloudformationで作ることはまだやっていませんが、開発環境のEvent-busのRuleをCloudformationで作ってみたので載せます。
参考にさせていただいたサイトはこちら
https://yomon.hatenablog.com/entry/2021/09/cw_alert_fowarding

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)。
実装方法はクラスメソッドさんの記事をご参考されてください。
https://dev.classmethod.jp/articles/try-to-access-the-resource-of-another-account-from-lambda/#toc-9

求む
開発環境にカスタムEvent-busを作って同じような設定をしたのですが、カスタムEvent-busがイベントを受け取っていないようでした。defaultだと設定で来たのに、カスタムだとできなくなるのが分からないです。分かる方いたら教えてください

以上です。

Discussion