マップ状態を使用してデータを動的に処理する - AWS Step Functions

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

マップ状態を使用してデータを動的に処理する

このサンプルプロジェクトでは、 Map 状態を使用した動的な並列処理を示します。このサンプルプロジェクトでは以下を作成します。

  • 2 つの AWS Lambda 関数

  • Amazon Simple Queue Service (Amazon SQS) キュー

  • Amazon Simple Notification Service (Amazon SNS) のトピック

  • Amazon DynamoDB テーブル

  • AWS Step Functions ステートマシン

このプロジェクトでは、Step Functions は AWS Lambda 関数を使用して Amazon SQS キューからメッセージをプルし、そのメッセージの JSON 配列を Map 状態に渡します。キューのメッセージごとに、ステートマシンはメッセージを DynamoDB に書き込み、他の Lambda 関数を呼び出して Amazon SQS からメッセージを削除し、Amazon SNS トピックにメッセージを発行します。

Map 状態と Step Functions サービス統合の詳細については、以下を参照してください。

ステートマシンを作成してリソースをプロビジョニングする

  1. Step Functions コンソールを開き、[Create a state machine] (ステートマシンの作成) を選択します。

  2. [Sample Projects] (サンプルプロジェクト) を選択してから、マップ状態を使用してデータを動的に処理します

    ステートマシン [Code] (コード) と [Visual Workflow] (ビジュアルワークフロー) が表示されます。

    
            マップ状態のワークフロー。
  3. [Next] (次へ) を選択します。

    作成されるリソースを示す [Deploy resources] (リソースのデプロイ) ページが表示されます。このサンプルプロジェクトでは、以下のリソースが含まれます。

    • Amazon SQS キュー

    • 1 つの Amazon SNS トピック

    • DynamoDB テーブル。

    • 2 つの Lambda 関数

    • Step Functions ステートマシン

  4. [Deploy Resources] (リソースのデプロイ) を選択します。

    注記

    これらのリソースおよび関連する IAM 許可が作成されるまで、最大 10 分かかることがあります。[Deploy resources] (リソースのデプロイ) ページが表示されている場合は、[Stack ID] (スタック ID) リンクを開いて、プロビジョンされているリソースを表示することができます。

サンプルプロジェクトのリソースがデプロイされたら、ステートマシンの実行をスタートする前に、Amazon SQS キューに項目を追加し、Amazon SNS トピックに登録する必要があります。

Amazon SNS トピックを購読します。

  1. [Amazon SNS console] (Amazon SNS コンソール) を開きます。

  2. [Topics] (トピック) を選択し、Map 状態サンプルプロジェクトで作成されたトピックを選択します。

    名前はMapSampleProj-SNSTopic-1cQO4HQ3IR1KN

  3. [Subscriptions] (サブスクリプション) で、[Create subscription] (サブスクリプションの作成) を選択します。

    [Create subscription] (サブスクリプションの作成) ページが表示され、トピックの [Topic ARN] (トピック ARN) が一覧表示されます。

  4. [Protocol] (プロトコル) で [Email] (E メール) を選択します。

  5. [Endpoint] (エンドポイント) で、トピックにサブスクライブする E メールアドレスを入力します。

  6. [Create subscription] (サブスクリプションの作成) を選択します。

    注記

    サブスクリプションがアクティブになる前に、E メールでの確認が必要です。

  7. 関連するアカウントでサブスクリプション確認用 E メールを開き、[Confirm subscription] (サブスクリプションを確認) するための URL を開きます。

    [Subscription confirmed!] (サブスクリプションを確認しました) ページが表示されます。

Amazon SQS キューにメッセージを追加

  1. [Amazon SQS コンソール] (Amazon SQS コンソール) を開きます。

  2. Map 状態のサンプルプロジェクトで作成されたキューを選択します。

    名前はMapSampleproj-SQSQueue-1udic9VZDORN7

  3. [Queue Actions] (キュー操作) リストで、[Send a Message] (メッセージの送信) を選択します。

  4. [Send a Message] (メッセージの送信) ウィンドウで、メッセージ 入力し、[Send Message] (メッセージの送信) を選択します。

  5. [Send Another Message] (別メッセージの送信) を選択します。

    Amazon SQS キューに複数のメッセージが追加されるまで、メッセージの入力を続けます。

  6. [Close] (閉じる) を選択します。

新しい実行のスタート

注記

Amazon SNS のキューは結果整合性があります。最良の結果を得るには、キューに入力してからステートマシンの実行を開始するまで数分待ちます。

  1. Step Functions コンソールを開きます。

  2. リポジトリの []ステートマシン[] ページで、MapStateStateMachineサンプルプロジェクトで作成された State machine を選択し、実行の開始

  3. [New execution] (新しい実行) ページで、実行名を入力し (オプション)、[Start Execution] (実行の開始) を選択します。

  4. (省略可能) 実行を識別するために、実行を識別するために、名前ボックスに移動するとそのように表示されます。デフォルトでは、Step Functions は自動的に一意の実行名を生成します。

    注記

    Step Functions では、非 ASCII 文字を含むステートマシン、実行、およびアクティビティ名を作成できます。これらの非 ASCII 名は Amazon では機能しませんCloudWatch。確実に追跡できるようCloudWatchメトリクスを選択するには、ASCII 文字のみを使用する名前を選択します。

  5. (オプション) Step Functions [Dashboard] (ダッシュボード) 上の新規作成ステートマシンに移動し、[New execution] (新しい実行) を選択します。

  6. 実行が完了したら、[Visual workflow] (ビジュアルワークフロー) で状態を選択して、[Step details] (ステップ詳細) で、[Input] (入力) そして [Output] (出力) を参照できます。

ステートマシンのコード例

このサンプルプロジェクトのステートマシンは、Amazon SQS、Amazon SNS、および Lambda にパラメータを直接渡すことで、これらのリソースと統合します。

このステートマシンの例を参照し、Resource フィールドの Amazon リソースネーム (ARN) に接続し、Parameters をサービス API に渡すことで、Step Functions が Lambda、DynamoDB、および Amazon SNS を制御する方法を確認します。

‭AWS Step Functions‬ で他の ‭AWS のサービスを制御する方法の詳細については、‭他のサービスで AWS Step Functions を使用する を参照してください。

{ "Comment": "An example of the Amazon States Language for reading messages from an SQS queue and iteratively processing each message.", "StartAt": "Read messages from SQS Queue", "States": { "Read messages from SQS Queue": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "MapSampleProj-ReadFromSQSQueueLambda-1MY3M63RMJVA9" }, "Next": "Are there messages to process?" }, "Are there messages to process?": { "Type": "Choice", "Choices": [ { "Variable": "$", "StringEquals": "No messages", "Next": "Finish" } ], "Default": "Process messages" }, "Process messages": { "Type": "Map", "Next": "Finish", "ItemsPath": "$", "Parameters": { "MessageNumber.$": "$$.Map.Item.Index", "MessageDetails.$": "$$.Map.Item.Value" }, "Iterator": { "StartAt": "Write message to DynamoDB", "States": { "Write message to DynamoDB": { "Type": "Task", "Resource": "arn:aws:states:::dynamodb:putItem", "ResultPath": null, "Parameters": { "TableName": "MapSampleProj-DDBTable-YJDJ1MKIN6C5", "ReturnConsumedCapacity": "TOTAL", "Item": { "MessageId": { "S.$": "$.MessageDetails.MessageId" }, "Body": { "S.$": "$.MessageDetails.Body" } } }, "Next": "Remove message from SQS queue" }, "Remove message from SQS queue": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "InputPath": "$.MessageDetails", "ResultPath": null, "Parameters": { "FunctionName": "MapSampleProj-DeleteFromSQSQueueLambda-198J2839ZO5K2", "Payload": { "ReceiptHandle.$": "$.ReceiptHandle" } }, "Next": "Publish message to SNS topic" }, "Publish message to SNS topic": { "Type": "Task", "Resource": "arn:aws:states:::sns:publish", "InputPath": "$.MessageDetails", "Parameters": { "Subject": "Message from Step Functions!", "Message.$": "$.Body", "TopicArn": "arn:aws:sns:us-east-1:012345678910:MapSampleProj-SNSTopic-1CQO4HQ3IR1KN" }, "End": true } } } }, "Finish": { "Type": "Succeed" } } }

IAM の例

サンプルプロジェクトで生成されたこれらの AWS Identity and Access Management (IAM) ポリシーの例には、ステートマシンおよび関連リソースを実行するために必要な最小特権が含まれています。IAM ポリシーで必要なアクセス許可のみを含めることをお勧めします。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:012345678901:function:MapSampleProj-ReadFromSQSQueueLambda-1MY3M63RMJVA9", "arn:aws:lambda:us-east-1:012345678901:function:MapSampleProj-DeleteFromSQSQueueLambda-198J2839ZO5K2" ], "Effect": "Allow" }, { "Action": [ "dynamodb:PutItem" ], "Resource": [ "arn:aws:dynamodb:us-east-1:012345678901:table/MapSampleProj-DDBTable-YJDJ1MKIN6C5" ], "Effect": "Allow" }, { "Action": [ "sns:Publish" ], "Resource": [ "arn:aws:sns:us-east-1:012345678901:MapSampleProj-SNSTopic-1CQO4HQ3IR1KN" ], "Effect": "Allow" } ] }

他の AWS のサービスで Step Functions を使用する時に IAM を設定する方法の情報については、統合サービスの IAM ポリシー を参照してください。