開始方法: Amazon EventBridge イベントバスルールを作成する - Amazon EventBridge

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

開始方法: Amazon EventBridge イベントバスルールを作成する

EventBridge ルールとその機能を理解するために、 CloudFormation テンプレートを使用してイベントバスルールと、イベントソース、イベントパターン、ターゲットなどの関連コンポーネントを設定します。次に、ルールの仕組みを確認し、必要なイベントを選択します。

このテンプレートは、デフォルトのイベントバスにルールを作成します。このルールは、イベントパターンを使用して、特定の Amazon S3 バケットのイベントをフィルタリングします。ルールは、指定されたターゲットである Amazon SNS トピックに一致するイベントを送信します。ルールは、オブジェクトがバケットに作成されるたびにトピックに通知を送信します。するとトピックは、指定された E メールアドレスに E メールを送信します。

デプロイされたリソースの構成は次のようになります。

  • EventBridge 通知が有効で、イベントソースとして機能する Amazon S3 バケット。

  • 通知のターゲットとして機能する Amazon SNS トピックと E メールサブスクリプション。

  • Amazon SNS トピックに公開するために必要なアクセス許可を EventBridge に付与する実行ロール。

  • ルール本体は次の動作を行います。

    • 特定の Amazon S3 バケットからの Object Created イベントのみに一致するイベントパターンを定義します。

    • 一致するイベントを EventBridge が配信するターゲットとして Amazon SNS トピックを指定します。

テンプレートの具体的な技術的詳細については、「テンプレートの詳細」を参照してください。

Amazon S3 イベントはルールのイベントパターンと照合され、一致すると SNS トピックに送信されます。

[開始する前に]

EventBridge で Amazon S3 イベントを受信するには、Amazon S3 内で EventBridge を有効にする必要があります。このトピックでは、EventBridge が有効であることを前提としています。詳細については、「Amazon S3 ユーザーガイド」の「Enabling EventBridge」を参照してください。

CloudFormation を使用したルールの作成

ルールとその関連リソースを作成するには、CloudFormation テンプレートを作成し、それを使用してサンプルルールおよびソースとターゲットが揃ったスタックを作成します。

重要

このテンプレートからスタックを作成した場合、Amazon リソースに対する料金が発生します。

まず、CloudFormation テンプレートを作成します。

  1. テンプレート セクションで、[JSON] または [YAML] タブのコピーアイコンをクリックして、テンプレートの内容をコピーします。

  2. テンプレートの内容を新しいファイルに貼り付けます。

  3. ファイルをローカルに保存します。

次に、保存したテンプレートを使用して CloudFormation スタックをプロビジョニングします。

CloudFormation を使用してスタックを作成する (コンソール)
  1. クラウドフォーメーション コンソール のhttps://console.aws.amazon.com/cloudformation/ 開きます:

  2. [スタック] ページでは、[スタックの作成] メニューで [新しいリソースを使用 (標準)] を選択します。

  3. テンプレートを指定します。

    1. [前提条件] で、[既存のテンプレートを選択] を選択します。

    2. [テンプレートの指定] で、[テンプレートファイルのアップロード] を選択します。

    3. [ファイルを選択] を選択し、テンプレートファイルに移動して選択します。

    4. [次へ] を選択します。

  4. スタックの詳細を指定します:

    1. スタック名を入力します。

    2. BucketName には、グローバルに一意のバケット名を入力します。Amazon S3 バケット名は、すべての AWS アカウントで一意である必要があります。

    3. SNSTopicDisplayNameSNSTopicName、および RuleName の場合は、デフォルト値を受け入れるか、独自の値を入力します。

    4. [EmailAddress] には、通知を受信する有効な E メールアドレスを入力します。

    5. [次へ] を選択します。

  5. スタックオプションを設定します。

    1. [スタック障害オプション] で、[新しく作成されたリソースをすべて削除] を選択します。

      注記

      このオプションを選択すると、スタックの作成に失敗した場合でも削除ポリシーで保持するように指定されているリソースに対して、課金される可能性を防ぐことができます。詳細については、「CloudFormation ユーザーガイド」の「DeletionPolicy 属性」を参照してください。

    2. 他はすべて、デフォルト値を受け入れます。

    3. [機能] では、チェックボックスをオンにして、CloudFormation によってアカウントに IAM リソースが作成される場合があることを承認します。

    4. [次へ] を選択します。

  6. スタックの詳細を確認して、[送信] を選択します。

CloudFormation を使用してスタックを作成する (AWS CLI)

を使用してスタック AWS CLI を作成することもできます。

  • create-stack コマンドを使用します。

    • スタック名、E メールアドレス、バケット名を指定して、デフォルトのテンプレートパラメータ値を受け入れます。template-body パラメータを使用してテンプレートコンテンツを渡すか、template-url で URL の場所を指定します。

      aws cloudformation create-stack \ --stack-name eventbridge-rule-tutorial \ --template-body template-contents \ --parameters \ ParameterKey=EmailAddress,ParameterValue=your.email@example.com \ ParameterKey=BucketName,ParameterValue=my-unique-bucket-name \ --capabilities CAPABILITY_IAM
    • 1 つまたは複数のテンプレートパラメータのデフォルト値を上書きします。例えば、次のようになります。

      aws cloudformation create-stack \ --stack-name eventbridge-rule-tutorial \ ----template-body template-contents \ --parameters \ ParameterKey=EmailAddress,ParameterValue=your.email@example.com \ ParameterKey=BucketName,ParameterValue=my-custom-bucket-name \ ParameterKey=RuleName,ParameterValue=my-custom-rule-name \ --capabilities CAPABILITY_IAM

CloudFormation はスタックを作成します。スタックの作成が完了すると、スタックリソースを使用する準備が整います。スタックの詳細ページの [リソース] タブを使用して、アカウントにプロビジョニングされたリソースを表示できます。

スタックが作成されると、指定したアドレスにサブスクリプション確認メールが送信されます。通知を受信するには、このサブスクリプションを確認する必要があります。

ルール機能の確認

ルールが作成されたら、EventBridge コンソールを使用して、ルールの動作とテストイベントの配信を監視できます。

  1. https://console.aws.amazon.com/events/home?#/rules で、EventBridge コンソールを開きます。

  2. 作成したルールを選択します。

    ルールの詳細ページでは、[ルールの詳細] セクションに、イベントパターンやターゲットなどのルールに関する情報が表示されます。

イベントパターンの検証

ルールの動作をテストする前に、ターゲットに送信するイベントを制御するために指定したイベントパターンを確認しましょう。ルールは、パターン条件に一致するイベントのみをターゲットに送信します。この場合、特定のバケットにオブジェクトが作成されたときに Amazon S3 が生成するイベントのみが必要です。

  • ルールの詳細ページの [イベントパターン] で、イベントパターンが次のようなイベントのみを選択するのを確認できます。

    • ソースが Amazon S3 サービス (aws.s3) である

    • detail-type が Object Created である

    • バケット名が、作成したバケットの名前と一致する

    { "source": ["aws.s3"], "detail-type": ["Object Created"], "detail": { "bucket": { "name": ["eventbridge-rule-example-source"] } } }

ルールを介したイベントの送信

次に、イベントソースでイベントを生成して、ルールの照合と配信が正常に動作していることをテストします。これを行うには、イベントソースとして指定した S3 バケットにオブジェクトをアップロードします。

  1. Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. バケットリストで、テンプレートで作成したバケットを選択します。

  3. アップロード を選択します。

  4. テストファイルをアップロードして Object Created イベントを生成します。

    1. [ファイルを追加] を選択して、コンピュータからファイルを選択します。

    2. アップロード を選択します。

  5. EventBridge によってイベントが処理され、通知が送信されるまでしばらく待ちます。

  6. オブジェクト作成イベントに関する通知の E メールを確認します。E メールには、バケット名やオブジェクトキーなど、S3 イベントの詳細が含まれています。

ルールメトリクスの表示

ルールのメトリクスを表示して、イベントが正しく処理されていることを確認することができます。

  1. EventBridge コンソールでルールを選択します。

  2. [メトリクス] タブをクリックします。

  3. 次のようなメトリクスを表示できます。

    • Invocations: ルールがトリガーされた回数。

    • TriggeredRules: 一致するイベントによってトリガーされたルールの数。

クリーンアップ: リソースの削除

最後のステップとして、スタックとそれに含まれるリソースを削除します。

重要

スタックに含まれる Amazon リソースが存在する限り料金が発生するためです。

  1. クラウドフォーメーション コンソール のhttps://console.aws.amazon.com/cloudformation/ 開きます:

  2. [スタック] ページで、テンプレートから作成されたスタックを選択し、[削除] を選択してから、[削除] で確定します。

    CloudFormation は、スタックとそれに含まれるすべてのリソースの削除を開始します。

CloudFormation テンプレートファイルの詳細

このテンプレートは、アカウントにリソースを作成し、アクセス許可を付与します。

リソース

このチュートリアルで使用する CloudFormation テンプレートでは、以下のリソースがアカウントに作成されます。

重要

このテンプレートからスタックを作成した場合、Amazon リソースに対する料金が発生します。

  • AWS::S3::Bucket: EventBridge 通知が有効で、ルールのイベントソースとして機能する Amazon S3 バケット。

  • AWS::SNS::Topic: ルールに一致するイベントのターゲットとして機能する Amazon SNS トピック。

  • AWS::SNS::Subscription: SNS トピックに対する E メールサブスクリプション。

  • AWS::IAM::Role: EventBridge サービスと Lambda クリーンアップ関数にアクセス許可を付与する IAM 実行ロール。

  • AWS::Events::Rule: Amazon S3 バケットイベントを Amazon SNS トピックに接続するルール。

  • AWS::Lambda::Function: スタックが削除されたときに Amazon S3 バケットを空にして、すべてのリソースのクリーン削除を可能にする Lambda 関数。

アクセス許可

テンプレートには、実行ロールを表す AWS::IAM::Role リソースが含まれています。このロールは、EventBridge サービス (events.amazonaws.com) にアカウント内の次のアクセス許可を付与します。

次のアクセス許可は、管理ポリシー AmazonSNSFullAccess を通じて付与されます。

  • Amazon SNS リソースおよびオペレーションへのフルアクセス。

CloudFormation テンプレート

次の YAML コードを別のファイルとして保存し、このチュートリアルの CloudFormation テンプレートとして使用します。

YAML
AWSTemplateFormatVersion: '2010-09-09' Description: '[AWSDocs] EventBridge: event-bus-rule-get-started' Parameters: BucketName: Type: String Description: Name of the S3 bucket (must be globally unique) SNSTopicDisplayName: Type: String Description: Display name for the SNS topic Default: eventbridge-rule-example-target SNSTopicName: Type: String Description: Name for the SNS topic Default: eventbridge-rule-example-target RuleName: Type: String Description: Name for the EventBridge rule Default: eventbridge-rule-example EmailAddress: Type: String Description: Email address to receive notifications AllowedPattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+[a-zA-Z0-9-]*(\\.[a-zA-Z0-9-]+)*$' Resources: # S3 Bucket with notifications enabled S3Bucket: Type: AWS::S3::Bucket Properties: BucketName: !Ref BucketName NotificationConfiguration: EventBridgeConfiguration: EventBridgeEnabled: true # Lambda function to empty the S3 bucket before deletion EmptyBucketFunction: Type: AWS::Lambda::Function Properties: Runtime: python3.12 Handler: index.handler Timeout: 60 Role: !GetAtt EmptyBucketRole.Arn Code: ZipFile: | import boto3 import cfnresponse def handler(event, context): bucket = event['ResourceProperties']['BucketName'] if event['RequestType'] == 'Delete': s3 = boto3.resource('s3') bucket_resource = s3.Bucket(bucket) bucket_resource.objects.all().delete() cfnresponse.send(event, context, cfnresponse.SUCCESS, {}) # IAM Role for the bucket cleanup Lambda function EmptyBucketRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Policies: - PolicyName: EmptyBucketPolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:DeleteObject - s3:ListBucket Resource: - !Sub arn:aws:s3:::${BucketName} - !Sub arn:aws:s3:::${BucketName}/* # Custom resource to trigger bucket cleanup on stack deletion EmptyBucketOnDelete: Type: Custom::EmptyBucket Properties: ServiceToken: !GetAtt EmptyBucketFunction.Arn BucketName: !Ref S3Bucket # SNS Topic for email notifications SNSTopic: Type: AWS::SNS::Topic Properties: DisplayName: !Ref SNSTopicDisplayName TopicName: !Ref SNSTopicName # SNS Subscription for email SNSSubscription: Type: AWS::SNS::Subscription Properties: Protocol: email Endpoint: !Ref EmailAddress TopicArn: !Ref SNSTopic # EventBridge Rule to match S3 object creation events and send them to the SNS topic EventBridgeRule: Type: AWS::Events::Rule Properties: Name: !Ref RuleName Description: "Rule to detect S3 object creation and send email notification" EventPattern: source: - aws.s3 detail-type: - "Object Created" detail: bucket: name: - !Ref BucketName State: ENABLED Targets: - Id: SendToSNS Arn: !Ref SNSTopic RoleArn: !GetAtt EventBridgeRole.Arn # IAM Role for EventBridge to publish to SNS EventBridgeRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: events.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSNSFullAccess Outputs: BucketName: Description: Name of the S3 bucket Value: !Ref S3Bucket SNSTopicARN: Description: ARN of the SNS topic Value: !Ref SNSTopic EmailSubscription: Description: Email address for notifications Value: !Ref EmailAddress
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "[AWSDocs] EventBridge: event-bus-rule-get-started", "Parameters": { "BucketName": { "Type": "String", "Description": "Name of the S3 bucket (must be globally unique)" }, "SNSTopicDisplayName": { "Type": "String", "Description": "Display name for the SNS topic", "Default": "eventbridge-rule-example-target" }, "SNSTopicName": { "Type": "String", "Description": "Name for the SNS topic", "Default": "eventbridge-rule-example-target" }, "RuleName": { "Type": "String", "Description": "Name for the EventBridge rule", "Default": "eventbridge-rule-example" }, "EmailAddress": { "Type": "String", "Description": "Email address to receive notifications", "AllowedPattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+[a-zA-Z0-9-]*(\\.[a-zA-Z0-9-]+)*$" } }, "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": { "Ref": "BucketName" }, "NotificationConfiguration": { "EventBridgeConfiguration": { "EventBridgeEnabled": true } } } }, "EmptyBucketFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Runtime": "python3.12", "Handler": "index.handler", "Timeout": 60, "Role": { "Fn::GetAtt": ["EmptyBucketRole", "Arn"] }, "Code": { "ZipFile": "import boto3\nimport cfnresponse\ndef handler(event, context):\n bucket = event['ResourceProperties']['BucketName']\n if event['RequestType'] == 'Delete':\n s3 = boto3.resource('s3')\n bucket_resource = s3.Bucket(bucket)\n bucket_resource.objects.all().delete()\n cfnresponse.send(event, context, cfnresponse.SUCCESS, {})" } } }, "EmptyBucketRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }, "ManagedPolicyArns": [ "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" ], "Policies": [ { "PolicyName": "EmptyBucketPolicy", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:DeleteObject", "s3:ListBucket"], "Resource": [ {"Fn::Sub": "arn:aws:s3:::${BucketName}"}, {"Fn::Sub": "arn:aws:s3:::${BucketName}/*"} ] } ] } } ] } }, "EmptyBucketOnDelete": { "Type": "Custom::EmptyBucket", "Properties": { "ServiceToken": { "Fn::GetAtt": ["EmptyBucketFunction", "Arn"] }, "BucketName": { "Ref": "S3Bucket" } } }, "SNSTopic": { "Type": "AWS::SNS::Topic", "Properties": { "DisplayName": { "Ref": "SNSTopicDisplayName" }, "TopicName": { "Ref": "SNSTopicName" } } }, "SNSSubscription": { "Type": "AWS::SNS::Subscription", "Properties": { "Protocol": "email", "Endpoint": { "Ref": "EmailAddress" }, "TopicArn": { "Ref": "SNSTopic" } } }, "EventBridgeRule": { "Type": "AWS::Events::Rule", "Properties": { "Name": { "Ref": "RuleName" }, "Description": "Rule to detect S3 object creation and send email notification", "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "Object Created" ], "detail": { "bucket": { "name": [ { "Ref": "BucketName" } ] } } }, "State": "ENABLED", "Targets": [ { "Id": "SendToSNS", "Arn": { "Ref": "SNSTopic" }, "RoleArn": { "Fn::GetAtt": [ "EventBridgeRole", "Arn" ] } } ] } }, "EventBridgeRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }, "ManagedPolicyArns": [ "arn:aws:iam::aws:policy/AmazonSNSFullAccess" ] } } }, "Outputs": { "BucketName": { "Description": "Name of the S3 bucket", "Value": { "Ref": "S3Bucket" } }, "SNSTopicARN": { "Description": "ARN of the SNS topic", "Value": { "Ref": "SNSTopic" } }, "EmailSubscription": { "Description": "Email address for notifications", "Value": { "Ref": "EmailAddress" } } } }