Amazon Web Services ブログ

AWS Step Functions が、ワークフローの自動化を容易にする 200 の AWS サービスのサポートを開始

現在、 AWS Step Functions は、新しい機能の AWS SDK サービス統合により、サポートされている AWS のサービスの数を 17 から 200 以上に、AWS API アクションを 46 から 9,000 以上に拡張しています。

デベロッパーが分散アーキテクチャを構築する場合、使用するパターンの 1 つがワークフローベースのオーケストレーションパターンです。このパターンは、分散トランザクションを実行するためのサービス内のワークフローの自動化に役立ちます。分散トランザクションの例として、注文を処理し、常にトランザクションステータスを追跡するために必要なすべてのタスクがあります。

Step Functions は、ワークフローの自動化、サービスのオーケストレーション、およびこのパターンの適用の支援に使用されるローコードのビジュアルワークフローサービスです。デベロッパーは、人工知能サービスAmazon Simple Storage Service (Amazon S3) 、および Amazon DynamoDB などのマネージドサービスで titletitleStep Functions を使用します。

Step Functions の紹介 AWS SDK サービス統合
今日まで、デベロッパーは AWS のサービスと統合するワークフローを構築する際に、 Step Functions が提供する 46 種類のサポート対象のサービス統合から選択する必要がありました。サービス統合が利用できない場合、AWS Lambda 関数で統合をコーディングする必要がありました。これは、アプリケーションの複雑さとコストが増大するため、理想的ではありません。

Step Functions AWS SDK サービス統合により、デベロッパーはステートマシンを AWS SDK をサポートする AWS のサービスに直接統合できるようになりました。

AWS SDK サービスと Amazon States Language (ASL)AWS Cloud Development Kit (AWS CDK) との統合を使用する、または AWS Step Function Workflow Studio を視覚的に使用するステートマシンを作成できます。開始するには、新しい Task 状態を作成します。次に、Task 状態の Resource フィールドの ASL から AWS SDK サービスを直接呼び出します。これを行うには、次の構文を使用します。

arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern]

デモを開始する方法をお見せします。

デモ
このデモでは、S3 に保存された動画ファイルが提供されると、それを文字起こしして、英語からスペイン語に翻訳するアプリケーションを構築しています。

Step Functions を使ってこのデモを作成しましょう。ステートマシンは、サービス統合により、 S3 Amazon Transcribe、および Amazon Translate に直接統合されます。文字起こしのための API は非同期です。文字起こしジョブが完了したことを確認するには、ポーリングループが必要です。ポーリングループは、ジョブの準備が完了するまで待機します。

構築するステートマシン

ステートマシンの作成
このデモをフォローするには、次の前提条件を満たす必要があります。

  • 処理する元のファイルを格納する S3 バケット
  • そのバケットに保存されている英語の動画ファイルまたは音声ファイル
  • 処理を実行する S3 バケット

AWS マネジメントコンソールを使用してこのデモを行う方法を説明します。このデモを Infrastructure as Code としてデプロイする場合は、このプロジェクトの AWS CloudFormation テンプレートをデプロイします。

このデモを開始するには、新しい標準ステートマシンを作成します。[Write your workflow in code] オプションを選択し、ASL を使用してステートマシンを構築します。ステートマシンの名前を作成し、新しいロールを作成します。

ステートマシンの作成

文字起こしジョブを開始
ステートマシン定義の作業を開始するには、ステートマシンを編集します。

ステートマシン定義を編集する

次の ASL コードは、新しい AWS SDK サービス統合機能を使用する 2 つのタスクを含むステートマシンです。最初のタスクは、1 つの S3 バケットから別の S3 バケットにファイルをコピーすることです。2 番目のタスクは、 Amazon Transcribe を直接呼び出して文字起こしジョブを開始することです。

Step Functions のこの新機能を使用するためには、状態タイプがタスクである必要があります。次の構文を使用して、サービス名と API アクションを指定する必要があります。“arn:aws:states:::aws-sdk:serviceName:apiAction.<serviceIntegrationPattern>”.「CopyObject」などのリソースフィールドの APIAction 名には CamelCase を使用し、「CopySource」などの「パラメータ」フィールドのパラメータ名には PascalCase を使用します。

パラメータについては、このサービスと API アクションの AWS API ドキュメントで名前と必要なパラメータを見つけます。

{
  "Comment": "A State Machine that process a video file",
  "StartAt": "GetSampleVideo",
  "States": {
    "GetSampleVideo": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:s3:copyObject",
      "Parameters": {
        "Bucket.$": "$.S3BucketName",
        "Key.$": "$.SampleDataInputKey",
        "CopySource.$": "States.Format('{}/{}',$.SampleDataBucketName,$.SampleDataInputKey)"
      },
      "ResultPath": null,
      "Next": "StartTranscriptionJob"
    },
    "StartTranscriptionJob": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:transcribe:startTranscriptionJob",
      "Parameters": {
        "Media": {
          "MediaFileUri.$": "States.Format('s3://{}/{}',$.S3BucketName,$.SampleDataInputKey)"
        },
        "TranscriptionJobName.$": "$$.Execution.Name",
        "LanguageCode": "en-US",
        "OutputBucketName.$": "$.S3BucketName",
        "OutputKey": "transcribe.json"
      },
      "ResultPath": "$.transcription",
      "End": true
    }
  }
}

前のコードでは、ASL が提供する組み込み関数の興味深いユースケースを確認できます。異なるパラメータを使用して文字列を作成できます。組み込み関数を AWS SDK サービス統合と組み合わせて使用すると、 Lambda 関数を必要とせずにデータを操作できます。たとえば、次の行です。

"MediaFileUri.$": "States.Format('s3://{}/{}',$.S3BucketName,$.SampleDataInputKey)"

ステートマシンにアクセス許可を付与する
ステートマシンの実行を今すぐ開始すると、ステートマシンの実行は失敗します。このステートマシンには、S3 バケットにアクセスしたり、 Amazon Transcribe を使用したりするためのアクセス許可がありません。Step Functions は、ほとんどの AWS SDK サービス統合の IAM ポリシーを自動生成できないため、手動でロールに追加する必要があります。

これらのアクセス許可を、このステートマシン用に作成された IAM ロールに追加します。ロールへのクイックリンクは、ステートマシンの詳細にあります。「AmazonTranscribeFullAccess」ポリシーと「AmazonS3FullAccess」ポリシーをロールにアタッチします。

IAM ロールのリンク

ステートマシンを初めて実行する
アクセス許可が設定されたので、このステートマシンを実行できます。このステートマシンは、元の動画がアップロードされた S3 バケット名、ファイルの名前、およびこのファイルを保存してすべての処理を実行する S3 バケットの名前を入力として受け取ります。

これが機能するには、このファイルが動画ファイルまたは音声ファイルで、英語である必要があります。文字起こしジョブが完了すると、transcribe.json という名前の入力で指定したバケットに結果が保存されます。

 {
  "SampleDataBucketName": "<name of the bucket where the original file is>",
  "SampleDataInputKey": "<name of the original file>",
  "S3BucketName": "<name of the bucket where the processing will happen>"
}

StartTranscriptionJob は非同期呼び出しであるため、結果はすぐには表示されません。ステートマシンは API を呼び出すだけで、完了します。文字起こしジョブの準備が整うまで待ってから、transcribe.json ファイルの出力バケットで結果を確認する必要があります。

ポーリングループの追加
文字起こしの結果を使用してテキストを翻訳するため、ステートマシンは文字起こしジョブの完了を待つ必要があります。ステートマシンで API ポーラーを構築するのに、Task、Wait、および Choice 状態を使用できます。

  • Task 状態は、ジョブのステータスを取得します。この場合は、Amazon Transcribe サービスと API GetTranscriptionJob を呼び出しています。
  • Wait 状態は 20 秒間待機します。これは、文字起こしジョブの長さが入力ファイルのサイズに依存するからです。
  • Choice 状態は、ジョブのステータスの結果に基づいて正しいステップに移動します。ジョブが完了すると、マシン内の次のステップに移動し、完了していない場合は待機し続けます。

ポーリングループの状態

Wait 状態
追加する最初の状態は Wait 状態です。これは 20 秒間待機する単純な状態です。

"Wait20Seconds": {
        "Type": "Wait",
        "Seconds": 20,
        "Next": "CheckIfTranscriptionDone"
      },

Task 状態
次に追加する状態は Task 状態で、API getTranscriptionJob を呼び出します。この API を呼び出すには、文字起こしジョブ名を渡す必要があります。この状態は、Choice 状態の入力であるジョブステータスを返します。

"CheckIfTranscriptionDone": {
        "Type": "Task",
        "Resource": "arn:aws:states:::aws-sdk:transcribe:getTranscriptionJob",
        "Parameters": {
          "TranscriptionJobName.$": "$.transcription.TranscriptionJob.TranscriptionJobName"
        },
        "ResultPath": "$.transcription",
        "Next": "IsTranscriptionDone?"
      },

Choice 状態
Choice 状態には、文字起こしジョブのステータスが完了しているかどうかをチェックするルールが 1 つあります。そのルールが真であれば、次の状態に移行します。そうでない場合は、Wait 状態になります。

 "IsTranscriptionDone?": {
        "Type": "Choice",
        "Choices": [
          {
            "Variable": "$.transcription.TranscriptionJob.TranscriptionJobStatus",
            "StringEquals": "COMPLETED",
            "Next": "GetTranscriptionText"
          }
        ],
        "Default": "Wait20Seconds"
      },

文字起こしテキストを取得する
このステップでは、文字起こしジョブによって返された出力ファイルから、文字起こしテキストのみを抽出します。文字起こしされたテキストのみが必要です。結果ファイルには多くのメタデータが含まれているため、ファイルが長すぎて翻訳がわかりにくくなります。

これは、 Lambda 関数で通常行うステップです。しかし、ASL を使用すれば、ステートマシンから直接実行できます。

まず、S3 から結果ファイルを取得する AWS SDK サービス統合を使用して状態を作成する必要があります。次に、別の ASL 組み込み関数を使用して、ファイルテキストを文字列から JSON に変換します。

次の状態では、ファイルを JSON オブジェクトとして処理できます。この状態は Pass 状態で、前の状態からの出力をクリーンアップして、文字起こしされたテキストのみを取得します。

 "GetTranscriptionText": {
        "Type": "Task",
        "Resource": "arn:aws:states:::aws-sdk:s3:getObject",
        "Parameters": {
          "Bucket.$": "$.S3BucketName",
          "Key": "transcribe.json"
        },
        "ResultSelector": {
          "filecontent.$": "States.StringToJson($.Body)"
        },
        "ResultPath": "$.transcription",
        "Next": "PrepareTranscriptTest"
      },
  
      "PrepareTranscriptTest" : {
        "Type": "Pass",
        "Parameters": {
          "transcript.$": "$.transcription.filecontent.results.transcripts[0].transcript"
        },
        "Next": "TranslateText"
      },

テキストを翻訳する
文字起こしされたテキストを準備したら、それを翻訳することができます。そのために、Amazon Translate API translateText をステートマシンから直接使用します。これがステートマシンの最後の状態になり、この状態の出力に翻訳されたテキストを返します。

"TranslateText": {
        "Type": "Task",
        "Resource": "arn:aws:states:::aws-sdk:translate:translateText",
        "Parameters": {
          "SourceLanguageCode": "en",
          "TargetLanguageCode": "es",
          "Text.$": "$.transcript"
         },
         "ResultPath": "$.translate",
        "End": true
      }

「TranslateReadOnly」管理ポリシーをアタッチして、Translate API を呼び出すためのアクセス許可をステートマシンに追加します。

これらすべてが揃ったら、ステートマシンを実行できます。ステートマシンの実行が終了すると、最後の状態の出力に翻訳されたテキストが表示されます。

最終ステートマシン

知っておくべき重要なこと
AWS SDK サービス統合の使用に役立つ事項をいくつか紹介します。

  • Task 状態のリソースフィールドの ASL から AWS SDK サービスを直接呼び出します。これを行うには、次の構文を使用します。arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern]
  • 「CopyObject」などのリソースフィールドの APIAction 名には CamelCase を使用し、「CopySource」などの「パラメータ」フィールドのパラメータ名には PascalCase を使用します。
  • Step Functions は、ほとんどの AWS SDK サービス統合の IAM ポリシーを自動生成できないため、ステートマシンの IAM ロールに手動で追加する必要があります。
  • ASL 組み込み関数を活用します。これらの関数を使用すると、データを操作でき、単純な変換に Lambda 関数を使用する必要がなくなるためです。

今すぐ使用開始いただけます
AWS SDK サービス統合は、米国東部(バージニア北部)米国東部(オハイオ)米国西部(オレゴン)カナダ(中央)欧州(アイルランド)欧州(ミラノ)アフリカ(ケープタウン)およびアジアパシフィック (東京)で一般にご利用いただけます。これは、Step Functions が今後利用可能になる他のすべての商用リージョンで一般提供される予定です。

この新機能の詳細については、そのドキュメントを参照してください

Marcia

原文はこちらです。