

# Amazon EventBridge イベントによる AWS Glue ワークフローの開始
<a name="starting-workflow-eventbridge"></a>

Amazon EventBridge (別名 CloudWatch Events) を使用すると、AWS サービスを自動化して、アプリケーションの可用性の問題やリソースの変更などのシステム的なイベントに自動的に対応できます。AWS のサービスからのイベントは、ほぼリアルタイムに EventBridge に提供されます。簡単なルールを記述して、注目するイベントと、イベントがルールに一致した場合に自動的に実行するアクションを指定できます。

EventBridge の機能を使用することで、AWS Glue は、イベント駆動型アーキテクチャにおけるイベントのプロデューサおよびコンシューマとして動作します。ワークフローに対して AWS Glue では、コンシューマーとして、あらゆるタイプの EventBridge イベントをサポートしています。このための最も一般的なユースケースとしては、Amazon S3 バケットが新しいオブジェクトを受け取る場合が挙げられます。データが、不規則または定義されていない間隔で到着した際には、可能なかぎり素早くそれを処理できます。

**注記**  
AWS Glue は、EventBridge メッセージの配信を保証していません。EventBridge により重複したメッセージが配信された場合にも、AWS Glue は、重複の排除を行いません。対応すべき処理は、ユースケースに基づいて管理する必要があります。  
不要なイベントが送信されないように、EventBridge ルール適切に設定します。

**[開始する前に]**  
Amazon S3 データイベントを使用してワークフローを開始する場合は、対象の S3 バケットのイベントが AWS CloudTrail および EventBridge にログ記録されたことを確認します。そのためには、CloudTrail の証跡を作成する必要があります。詳細については、「[Creating a trail for your AWS account](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)」を参照してください。

**EventBridge イベントを使用してワークフローを開始するには**
**注記**  
以下のコマンドで、下記のような置き換えを行います。  
*<workflow-name>* には、ワークフローに割り当てる名前。
*<trigger-name>* には、トリガーに割り当てる名前。
*<bucket-name>* には、Amazon S3 バケットの名前。
*<account-id>* には、有効な AWS アカウント ID。
*<region>* には、リージョン名 (例: `us-east-1`)
*<rule-name>* には、EventBridge ルールに割り当てる名前。

1. EventBridge ルールとターゲットを作成および表示するための、AWS Identity and Access Management (IAM) アクセス許可があることを確認します。以下は、アタッチできるサンプルのポリシーです。オペレーションとリソースを制限するために、このポリシーの範囲を狭めたい場合もあります。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "events:PutRule",
           "events:DisableRule",
           "events:DeleteRule",
           "events:PutTargets",
           "events:RemoveTargets",
           "events:EnableRule",
           "events:List*",
           "events:Describe*"
         ],
         "Resource": "*"
       }
     ]
   }
   ```

------

1. AWS Glue にイベントが渡される際に、EventBridge サービスが引き受けることができる IAM ロールを作成します。

   1. IAM コンソールの [**Create role**] (ロールの作成) ページで、[**AWS Service**] を選択します。次に、[**CloudWatch Events**] (CloudWatch イベント) サービスを選択します。

   1. [**Create role**] (ロールの作成) ウィザードを完了します。ポリシー `CloudWatchEventsBuiltInTargetExecutionAccess` および `CloudWatchEventsInvocationAccess` が、ウィザードにより自動的にアタッチされます。

   1. 次のインラインポリシーをロールにアタッチします。このポリシーにより、EventBridge サービスはイベントを AWS Glue に送れるようになります。

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "glue:notifyEvent"
            ],
            "Resource": [
              "arn:aws:glue:us-east-1:111122223333:workflow/workflow-name"
            ]
          }
        ]
      }
      ```

------

1. 次のコマンドを入力して、ワークフローを作成します。

   この他のオプションのコマンドラインパラメータについては、*AWS CLI コマンドリファレンス*の「[create-workflow](https://docs.aws.amazon.com/cli/latest/reference/glue/create-workflow.html)」を参照してください。

   ```
   aws glue create-workflow --name <workflow-name>
   ```

1. 次のコマンドを入力して、ワークフローのための EventBridge イベントトリガーを作成します。これがワークフローの開始トリガーになります。*<actions>*は、実行するアクション (開始するジョブとクローラ) に置き換えます。

   引数 `actions` の記述方法については、*AWS CLIコマンドリファレンス*の「[create-trigger](https://docs.aws.amazon.com/cli/latest/reference/glue/create-trigger.html)」を参照してください。

   ```
   aws glue create-trigger --workflow-name <workflow-name> --type EVENT --name <trigger-name> --actions <actions>
   ```

   単一の EventBridge イベントではなく、バッチされたイベントによってワークフローをトリガーする場合は、代わりに次のコマンドを入力します。

   ```
   aws glue create-trigger --workflow-name <workflow-name> --type EVENT --name <trigger-name> --event-batching-condition BatchSize=<number-of-events>,BatchWindow=<seconds> --actions <actions>
   ```

   `event-batching-condition` 引数の `BatchSize` は必須であり、`BatchWindow` はオプションです。`BatchWindow` が省略された場合、ウィンドウはデフォルトで (最大ウィンドウサイズの) 900 秒に設定されます。  
**Example**  

   次の例では、3 つの EventBridge イベントを受信した後、または最初のイベントが到着してから 5 分経過後の、いずれか早いタイミングで `eventtest` ワークフロー開始するトリガーを作成しています。

   ```
   aws glue create-trigger --workflow-name eventtest --type EVENT --name objectArrival --event-batching-condition BatchSize=3,BatchWindow=300 --actions JobName=test1
   ```

1. Amazon EventBridge でルールを作成します。

   1. 任意のテキストエディタで JSON オブジェクトを作成し、ルールの詳細を記述します。

      次の例では、イベントソースとして Amazon S3 を、イベント名として `PutObject` を、リクエストパラメータとしてバケット名を、それぞれ指定しています。このルールは、新しいオブジェクトがバケットで受信された場合にワークフローを開始します。

      ```
      {
        "source": [
          "aws.s3"
        ],
        "detail-type": [
          "AWS API Call via CloudTrail"
        ],
        "detail": {
          "eventSource": [
            "s3.amazonaws.com"
          ],
          "eventName": [
            "PutObject"
          ],
          "requestParameters": {
            "bucketName": [
              "<bucket-name>"
            ]
          }
        }
      }
      ```

      新しいオブジェクトがバケット内のフォルダに到着した際にワークフローを開始させるには、次のコードを `requestParameters` に置き換えます。

      ```
          "requestParameters": {
            "bucketName": [
              "<bucket-name>"
            ]
            "key" : [{ "prefix" : "<folder1>/<folder2>/*"}}]
        }
      ```

   1. 任意のツールを使用して、ルールを記述した JSON オブジェクトの文字列をエスケープします。

      ```
      {\n  \"source\": [\n    \"aws.s3\"\n  ],\n  \"detail-type\": [\n    \"AWS API Call via CloudTrail\"\n  ],\n  \"detail\": {\n    \"eventSource\": [\n      \"s3.amazonaws.com\"\n    ],\n    \"eventName\": [\n      \"PutObject\"\n    ],\n    \"requestParameters\": {\n      \"bucketName\": [\n        \"<bucket-name>\"\n      ]\n    }\n  }\n}
      ```

   1. 次のコマンドを実行して、JSON パラメータテンプレートを作成します。このテンプレートを編集して、後続の `put-rule` コマンドの入力パラメータを指定します。出力をファイルに保存します。この例では、`ruleCommand` というファイルに保存しています。

      ```
      aws events put-rule --name <rule-name> --generate-cli-skeleton >ruleCommand
      ```

      `--generate-cli-skeleton` パラメータの詳細については、「*AWS Command Line Interface ユーザーガイド*」の「[Generating AWS CLI skeleton and input parameters from a JSON or YAML input file](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-skeleton.html)」を参照してください。

      出力ファイルは以下のようになります。

      ```
      {
          "Name": "",
          "ScheduleExpression": "",
          "EventPattern": "",
          "State": "ENABLED",
          "Description": "",
          "RoleArn": "",
          "Tags": [
              {
                  "Key": "",
                  "Value": ""
              }
          ],
          "EventBusName": ""
      }
      ```

   1. このファイルを編集して、少なくとも `Name`、`EventPattern`、および `State` パラメータを指定しながら、必要に応じて他のパラメータを削除します。`EventPattern` パラメータでは、前のステップで作成したルール詳細のために、エスケープされた文字列を指定します。

      ```
      {
          "Name": "<rule-name>",
          "EventPattern": "{\n  \"source\": [\n    \"aws.s3\"\n  ],\n  \"detail-type\": [\n    \"AWS API Call via CloudTrail\"\n  ],\n  \"detail\": {\n    \"eventSource\": [\n      \"s3.amazonaws.com\"\n    ],\n    \"eventName\": [\n      \"PutObject\"\n    ],\n    \"requestParameters\": {\n      \"bucketName\": [\n        \"<bucket-name>\"\n      ]\n    }\n  }\n}",
          "State": "DISABLED",
          "Description": "Start an AWS Glue workflow upon new file arrival in an Amazon S3 bucket"
      }
      ```
**注記**  
ワークフローの構築が完了するまで、ルールを無効にしたままにしておくことをお勧めします。

   1. 次の `put-rule` コマンドを入力し、ファイル `ruleCommand` から入力パラメータを読み取ります。

      ```
      aws events put-rule --name <rule-name> --cli-input-json file://ruleCommand
      ```

      次の出力は、正しく処理されたことを示しています。

      ```
      {
          "RuleArn": "<rule-arn>"
      }
      ```

1. 次のコマンドを入力して、ターゲットにルールをアタッチします。ターゲットは、AWS Glue のワークフローです。*<role-name>*は、この手順の最初に作成したロールに置き換えます。

   ```
   aws events put-targets --rule <rule-name> --targets "Id"="1","Arn"="arn:aws:glue:<region>:<account-id>:workflow/<workflow-name>","RoleArn"="arn:aws:iam::<account-id>:role/<role-name>" --region <region>
   ```

   次の出力は、正しく処理されたことを示しています。

   ```
   {
       "FailedEntryCount": 0,
       "FailedEntries": []
   }
   ```

1. 次のコマンドを入力して、ルールとターゲットの接続が正常に行われたことを確認します。

   ```
   aws events list-rule-names-by-target --target-arn arn:aws:glue:<region>:<account-id>:workflow/<workflow-name>
   ```

   接続に成功した場合は次のような出力になります。*<rule-name>* は作成したルールの名前です。

   ```
   {
       "RuleNames": [
           "<rule-name>"
       ]
   }
   ```

1. AWS マネジメントコンソール にサインインし、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。

1. ワークフローを選択し、ワークフローグラフで、開始トリガーとそのアクション (ワークフローが開始するジョブまたはクローラ) の表示を確認します。その後、[ステップ 3: さらにトリガーを追加する](creating_running_workflows.md#workflow-step3) の手順に進みます。または、AWS Glue API か AWS Command Line Interface を使用して、ワークフローに他のコンポーネントを追加します。

1. ワークフローの指定を完了したら、ルールを有効にします。

   ```
   aws events enable-rule --name <rule-name>
   ```

   これで、EventBridge イベントまたはイベントのバッチによって、ワークフローを開始する準備が整いました。

**関連情報**  
[Amazon EventBridge ユーザーガイド](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)
[AWS Glue のワークフローの概要](workflows_overview.md)
[AWS Glue でワークフローを手動により作成および構築する](creating_running_workflows.md)