AWS Lambda タスクの実装 - AWS Flow Framework for Java

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

AWS Lambda タスクの実装

AWS Lambda について

AWS Lambda は、カスタムコードによって生成されるイベント、またはさまざまな AWS のサービス (Amazon S3、DynamoDB、Amazon Kinesis、Amazon SNS、Amazon Cognito) から生成されるイベントに応答してコードを実行する、完全管理型のコンピューティングサービスです。Lambda の詳細については、「AWS Lambda デベロッパーガイドhttps://docs.aws.amazon.com/lambda/latest/dg/」を参照してください。

Amazon Simple Workflow Service は Lambda タスクを提供し、従来の Amazon SWF アクティビティの代わりに、またはそれと一緒に Lambda 関数を実行できるようにします。

重要

Amazon SWF が代わって実施した Lambda 実行 (リクエスト) の料金は、お使いの AWS アカウントに課金されます。Lambda 料金の詳細については、https://aws.amazon.com/lambda/pricing/ を参照してください。

Lambda タスクを使用する利点と制限

従来の Amazon SWF アクティビティの代わりに Lambda タスクを使用することには、多くの利点があります。

  • Lambda タスクは、Amazon SWF アクティビティタイプのように登録またはバージョン管理する必要はありません。

  • 既にワークフローで定義している既存の Lambda 関数を使用することができます。

  • Lambda 関数は Amazon SWF によって直接呼び出されます。従来のアクティビティのように実行するためのワーカープログラムを実装する必要はありません。

  • Lambda では、関数の実行を追跡し分析するためのメトリクスとログが用意されています。

Lambda タスクには注意すべきいくつかの制限があります。

  • Lambda タスクは、Lambda をサポートする AWS リージョンでのみ利用できます。Lambda で現在サポートされているリージョンの詳細については、「Amazon Web Services General Reference」(Amazon Web Services 全般リファレンス) の「Lambda Regions and Endpoints」(Lambda リージョンとエンドポイント) を参照してください。

  • Lambda タスクは現在、base SWF HTTP API と AWS Flow Framework for Java でのみサポートされています。現在、AWS Flow Framework for Ruby には、Lambda タスクのサポートはありません。

AWS Flow Framework for Java ワークフローでの Lambda タスクの使用

AWS Flow Framework for Java ワークフローで Lambda タスクを使用する要件が 3 つあります。

  • 実行するための Lambda 関数。定義した任意の Lambda 関数を使用できます。Lambda関数を作成する方法の詳細については、「AWS Lambda デベロッパーガイド」を参照してください。

  • Amazon SWF ワークフローから Lambda 関数を実行するアクセス権限を付与する IAM ロール。

  • ワークフロー内から Lambda タスクをスケジュールするコード。

IAM ロールのセットアップ

Amazon SWF から Lambda 関数を呼び出す前に、Amazon SWF から Lambda へのアクセス権を付与する IAM ロールを準備する必要があります。次のいずれかを実行できます。

  • あらかじめ定義されたロール、AWSLambdaRole を選択して、ワークフローにアカウントに関連する Lambda 関数を呼び出すアクセス許可を付与します。

  • 独自のポリシーと関連付けられたロールを定義して、Amazon リソースネーム (ARN) で指定された特定の Lambda 関数を呼び出すためのワークフローのアクセス許可を付与します。

IAM ロールのアクセス許可を制限する

Amazon SWF に提供する IAM ロールに対するアクセス許可を制限するには、リソースの信頼ポリシーの SourceArn および SourceAccount コンテキストキーを使用します。これらのキーは、指定されたドメイン ARN に属する Amazon Simple Workflow Service の実行からのみ使用されるように、IAM ポリシーの使用を制限します。これらのグローバル条件コンテキストキーの両方を、同じポリシーステートメントで使用する場合、aws:SourceAccount 値と aws:SourceArn 値の中の参照されるアカウントには、同じアカウント ID を使用する必要があります。

次の信頼ポリシーの例では、SourceArn コンテキストキーを使用して、アカウント 123456789012someDomain に属する Amazon Simple Workflow Service 実行時にのみ IAM サービスロールを使用するよう制限しています。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "swf.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:swf:*:123456789012:/domain/someDomain" } } } ] }

次の信頼ポリシーの例では、SourceAccount コンテキストキーを使用して、アカウント 123456789012 の Amazon Simple Workflow Service 実行時にのみ IAM サービスロールを使用するように制限しています。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "swf.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:SourceAccount": "123456789012" } } } ] }

Amazon SWF に Lambda ロールを呼び出すためのアクセスを提供する

あらかじめ定義されたロール、AWSLambdaRole を使用して、Amazon SWF ワークフローがアカウントに関連する Lambda 関数を呼び出せるようにできます。

AWSLambdaRole を使用して、Lambda 関数を呼び出すアクセス権を Amazon SWF に付与するには
  1. Amazon IAM コンソールを開きます。

  2. [Roles] (ロール) を選択してから [Create New Role] (ロールの新規作成) を選びます。

  3. ロールに swf-lambda などの名前を付け、[Next Step] (次のステップ) を選択します。

  4. [AWS サービスロール] で、[Amazon SWF]、[次のステップ] の順に選択します。

  5. [ポリシーのアタッチ] 画面で、リストから [AWSLambdaRole] を選択します。

  6. ロールを確認したら、[Next Step] (次のステップ) を選択してから、[Create Role] (ロールの作成) を選択します。

特定の Lambda 関数を呼び出すためのアクセス権を付与する IAM ロールの定義

ワークフローから特定の Lambda 関数を呼び出すためのアクセスを提供する場合は、独自の IAM ポリシーを定義する必要があります。

特定の Lambda 関数へのアクセスを提供する IAM ポリシーを作成するには
  1. Amazon IAM コンソールを開きます。

  2. [Policies] (ポリシー) を選択して、[Create Policy] (ポリシーの作成) を選択します。

  3. [Copy an AWS Managed Policy] (AWS 管理ポリシーをコピー) を選択して、リストから [AWSLambdaRole] を選択します。ポリシーが生成されます。必要に応じて名前と説明を編集することもできます。

  4. [Policy Document] (ポリシードキュメント) の [Resource] (リソース) フィールドに、Lambda 関数の ARN を追加します。例:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:111111000000:function:hello_lambda_function" ] } ] }
    注記

    IAM ロールでリソースを指定する方法の詳細については、「Using IAM」(IAM の使用) の「Overview of IAM Policies」(IAM ポリシーの概要) を参照してください。

  5. [Create Policy] (ポリシーの作成) を選択してポリシーの作成を完了します。

新しい IAM ロールを作成するときにこのポリシーを選択し、そのロールを使用して Amazon SWF ワークフローへのアクセスを呼び出すことができます。この手順は、AWSLambdaRole ポリシーを使用してロールを作成する場合と非常によく似ています。代わりに、ロールを作成するときに独自のポリシーを選択します。

Lambda ポリシーを使用して Amazon SWF ロールを作成するには
  1. Amazon IAM コンソールを開きます。

  2. [Roles] (ロール) を選択してから [Create New Role] (ロールの新規作成) を選びます。

  3. ロールに swf-lambda-function などの名前を付け、[Next Step] (次のステップ) を選択します。

  4. [AWS サービスロール] で、[Amazon SWF]、[次のステップ] の順に選択します。

  5. [ポリシーのアタッチ] 画面で、リストから Lambda 関数固有のポリシーを選択します。

  6. ロールを確認したら、[Next Step] (次のステップ) を選択してから、[Create Role] (ロールの作成) を選択します。

Lambda タスクの実行をスケジュール設定する

Lambda 関数の呼び出しを許可する IAM ロールを定義したら、ワークフローの一部として、実行スケジュールを設定できます。

注記

このプロセスは、AWS SDK for Java に含まれる HelloLambda サンプルで完全に実証されています。

Lambda タスクの実行をスケジュール設定するには
  1. ワークフロー実装で、LambdaFunctionClient のインスタンスを取得するには、DecisionContext インスタンスで getLambdaFunctionClient() を呼び出します。

    // Get a LambdaFunctionClient instance DecisionContextProvider decisionProvider = new DecisionContextProviderImpl(); DecisionContext decisionContext = decisionProvider.getDecisionContext(); LambdaFunctionClient lambdaClient = decisionContext.getLambdaFunctionClient();
  2. LambdaFunctionClientscheduleLambdaFunction() メソッドを使用してタスクをスケジュール設定します。その際、作成した Lambda 関数の名前と、Lambda タスクの入力データを渡します。

    // Schedule the Lambda function for execution, using your IAM role for access. String lambda_function_name = "The name of your Lambda function."; String lambda_function_input = "Input data for your Lambda task."; lambdaClient.scheduleLambdaFunction(lambda_function_name, lambda_function_input);
  3. ワークフロー実行スターターで、IAM lambda ロールをデフォルトワークフローオプションに追加するには、StartWorkflowOptions.withLambdaRole() を使用して、ワークフロー開始時にオプションを渡します。

    // Workflow client classes are generated for you when you use the @Workflow // annotation on your workflow interface declaration. MyWorkflowClientExternalFactory clientFactory = new MyWorkflowClientExternalFactoryImpl(sdk_swf_client, swf_domain); MyWorkflowClientExternal workflow_client = clientFactory.getClient(); // Give the ARN of an IAM role that allows SWF to invoke Lambda functions on // your behalf. String lambda_iam_role = "arn:aws:iam::111111000000:role/swf_lambda_role"; StartWorkflowOptions workflow_options = new StartWorkflowOptions().withLambdaRole(lambda_iam_role); // Start the workflow execution workflow_client.helloWorld("User", workflow_options);

HelloLambda サンプルを表示する

Lambda タスクを使用するワークフローを実装するサンプルは、AWS SDK for Java で入手できます。表示して実行するには、ソースをダウンロードします

HelloLambda サンプルを作成し、実行する詳細な方法については、Java 用 AWS Flow Framework サンプルに付属している README ファイルを参照してください。