AWS Step Functions
開発者ガイド

Amazon S3​ イベント発生時にステートマシンの実行を開始する

Amazon CloudWatch Events を使用して、イベント発生時またはスケジュールに従って Step Functions ステートマシンを実行できます。

このチュートリアルでは、CloudWatch イベント ルールのターゲットとしてステートマシンを設定する方法を説明します。ファイルが Amazon S3​ バケットに追加されると実行が開始されます。

実際のアプリケーションでは、バケットに追加したファイルに対してオペレーションを時刻するステートマシンを起動できます。イメージやビデオファイルに対するサムネイルの作成や Amazon Rekognition 分析の実行などです。

このチュートリアルでは、Amazon S3​ バケットにファイルを追加することで、シンプルな Helloworld​ ステートマシンの実行を開始します。次に、その実行のサンプル入力を確認して、CloudTrail​ からの入力にどのような情報が含まれているかを確認します。

前提条件: ステートマシンを作成する

CloudWatch イベント ターゲットを設定する前に、ステートマシンを作成する必要があります。

  • 基本的なステートマシンを作成するには、入門チュートリアルを使用します。

  • 既に Helloworld ステートマシンがある場合は、次のステップに進みます。

ステップ 1: Amazon S3 にバケットを作成する

Helloworld​ ステートマシンを用意した後は、Amazon S3​ バケットが必要です。このチュートリアルのステップ 3 で、バケットにファイルが追加されると CloudWatch イベント​ によってステートマシンの実行がトリガーされるようにルールを設定します。

  1. Amazon S3 コンソールに移動し、[バケットの作成] を選択します。

  2. [バケット名] を入力します (例: username-sfn-tutorial)。

    注記

    バケット名は必ず、Amazon S3 のすべての AWS リージョン内の既存バケット名の中で一意になるようにします。この名前を一意にするには、自分のユーザー名を使用します。すべてのリソースは同じ AWS リージョン内に作成する必要があります。

  3. [作成] を選択します。

ステップ 2: AWS CloudTrail で証跡を作成する

Amazon S3 バケットを作成したら、CloudTrail に証跡を作成します。

Amazon S3​ の API イベントが CloudWatch イベント​ のルールを満たすには、これらのイベントを受信するように CloudTrail​ の証跡を設定する必要があります。

  1. AWS CloudTrail コンソールに移動して、[証跡の表示]、[証跡の作成] の順に選択します。

  2. [証跡名] に、「S3Event」と入力します。

  3. [S3] タブで、[S3 バケットの追加] を選択します。

  4. [バケット名] に、作成しておいた Amazon S3 バケットの名前 (username-sfn-tutorial) を入力します (「ステップ 1: Amazon S3 にバケットを作成する」)。

  5. [保存場所] で、[新しい S3 バケットを作成しますか] の横の [はい] を選択します。

  6. [S3 バケット] に、先に作成した Amazon S3 バケットのアクションに関する情報を保存する新しいバケットの名前を入力します。

    注記

    このバケット名は、すべての Amazon S3 で一意である必要があります。名前を一意にするには、ユーザー名をバケット名に含めます (username-sfn-tutorial-storage)。

  7. [作成] を選択します。

ステップ 3: CloudWatch イベント ルールを作成する

ステートマシンが用意され、AWS CloudTrail​ に Amazon S3 バケットと証跡を作成したら、Amazon CloudWatch Events ルールを作成します。

注記

Amazon S3 バケットと同じ AWS リージョンに CloudWatch イベント を設定する必要があります。

ルールを作成するには

  1. CloudWatch イベントコンソールに移動し、[イベント] を選択して [ルールの作成] を選択します。

    [Step 1: Create rule] ページが表示されます。

  2. [イベントソース] で、[イベントパターン] を選択します。

  3. [サービス名] で、[Simple Storage Service (S3)] を選択します。

  4. [イベントタイプ] で、[オブジェクトレベルのオペレーション] を選択します。

  5. [特定のオペレーション] を選択したら、[PutObject] を選択します。

    注記

    オブジェクトのサイズが PutObject オペレーションで使用されているマルチパートしきい値より大きい場合、ログに記録される AWS CloudTrail API は PutObject ではなく CompleteMultipartUpload になります。AWS CloudTrail User Guide の「マルチパートアップロードの概要」を参照してください。

  6. [特定のバケット (名前別)] を選択し、ステップ 1 で作成したバケット名 (username-sfn-tutorial) を入力します。

[イベントソース] ページに次のように表示されます。


                    ルールの作成

ターゲットを作成するには

  1. [ターゲット] セクションで、[ターゲットの追加] を選択します。

  2. リストから [Step Functions ステートマシン] を選択し、[ステートマシン] のリストでステップ 1 のステートマシン (Helloworld) を選択します。

  3. CloudWatch イベント は、イベントの実行に必要な IAM ロールを作成できます。

    • 自動的に IAM ロールを作成するには、[この特定のリソースに対して新しいロールを作成する] を選択します。

    • 以前に作成した IAM ロールを使用するには、[既存のルールの使用] を選択します。

  4. [Configure details] を選択します。

    [Step 2: Configure rule details] ページが表示されます。

  5. [Name] にルールの名前 (S3StepFunctions など) を入力し、[State] で [Enabled] を選択してから、[Create rule] を選択します。

    [ルールの詳細を設定する] セクションは次のようになります。

    
                            ルールの詳細の設定

    ルールが作成され、[Rules] ページが表示されてすべての CloudWatch イベント ルールがリストされます。

ステップ 4 : CloudWatch ルールをテストする

すべて準備ができたので、Amazon S3 バケットへのファイルの追加をテストして、ステートマシンが実行された結果の入力を確認します。

  1. ファイルを Amazon S3 バケットに追加します。

    Amazon S3 コンソールに移動して作成したバケット (username-sfn-tutorial) を選択し、[アップロード] を選択します。

  2. ファイル (次の例の test.png) を追加し、[アップロード] を選択します。

    これによりステートマシンの実行が起動され、AWS CloudTrail​ からの情報が入力として渡されます。

  3. ステートマシンの実行を確認します。

    Step Functions コンソールに移動して、CloudWatch イベント ルールで使用されているステートマシン (Helloworld) を選択します

  4. そのステートマシンの細心の実行を選択して、[入力] セクションを展開します。

    この入力には、バケット名やオブジェクト名などの情報が含まれています。実際のユースケースでは、この入力を使用してステートマシンがそのオブジェクトに対してアクションを実行できます。

実行入力の例

以下の例に示しているのは、ステートマシン実行への一般的な入力です。

{ "version": "0", "id": "8d6f9246-b781-44f8-a026-f1c1ab2c61f0", "detail-type": "AWS API Call via CloudTrail", "source": "aws.s3", "account": "123456789012", "time": "2018-09-12T00:25:10Z", "region": "us-east-2", "resources": [], "detail": { "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AKIAIOSFODNN7EXAMPLE", "arn": "arn:aws:iam::123456789012:user/username", "accountId": "123456789012", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "userName": "username", "sessionContext": { "attributes": { "creationDate": "2018-09-11T20:10:38Z", "mfaAuthenticated": "true" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2018-09-12T00:25:10Z", "eventSource": "s3.amazonaws.com", "eventName": "PutObject", "awsRegion": "us-east-2", "sourceIPAddress": "203.0.113.34", "userAgent": "signin.amazonaws.com", "requestParameters": { "X-Amz-Date": "20180912T002509Z", "bucketName": "username-sfn-tutorial", "X-Amz-Algorithm": "AWS4-HMAC-SHA256", "x-amz-acl": "private", "X-Amz-SignedHeaders": "content-type;host;x-amz-acl;x-amz-storage-class", "X-Amz-Expires": "300", "key": "test.png", "x-amz-storage-class": "STANDARD" }, "responseElements": null, "additionalEventData": { "x-amz-id-2": "IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km" }, "requestID": "79104EXAMPLEB723", "eventID": "cdc4b7ed-e171-4cef-975a-ad829d4123e8", "readOnly": false, "resources": [ { "type": "AWS::S3::Object", "ARN": "arn:aws:s3:::username-sfn-tutorial-2/test.png" }, { "accountId": "123456789012", "type": "AWS::S3::Bucket", "ARN": "arn:aws:s3:::username-sfn-tutorial" } ], "eventType": "AwsApiCall", "recipientAccountId": "123456789012" } }