

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

# Step Functions でのクロスアカウント AWS リソースへのアクセス
<a name="tutorial-access-cross-acct-resources"></a>

Step Functions はクロスアカウントアクセスをサポートしており、異なる AWS アカウントで設定されたリソースの共有が可能です。このチュートリアルでは、「**Production**」というアカウントで定義されたクロスアカウント Lambda 関数にアクセスする手順について説明します。この関数は「**Development**」というアカウントのステートマシンから呼び出されます。このチュートリアルでは、「**Development**」アカウントを「*ソースアカウント*」と呼び、ターゲット IAM ロールを含む「**Production**」アカウントを「*ターゲットアカウント*」と呼びます。

クロスアカウントの Lambda 関数を呼び出す前に、まず `Task` 状態の定義で、ステートマシンが引き受ける必要があるターゲット IAM ロールを指定します。次に、ターゲット IAM ロールの信頼ポリシーを変更して、ソースアカウントがターゲットロールを一時的に引き受けられるようにします。また、 AWS リソースを呼び出すには、ターゲット IAM ロールで適切なアクセス許可を定義します。最後に、ソースアカウントの実行ロールを更新して、ターゲットロールの引き受けに必要な許可を指定します。

複数の AWS アカウントからリソースにアクセスするための IAM ロールを引き受けるように、ステートマシンを設定できます。ただし、`Task` 状態の定義に基づいて、ステートマシンが一度に引き受けられる IAM ロールは、1 つだけです。

**注記**  
クロスリージョン AWS SDK 統合とクロスリージョン AWS リソースアクセスは、Step Functions では使用できません。

## 前提条件
<a name="tutorial-access-cross-acct-resources-prereq"></a>
+ このチュートリアルでは、クロスアカウントアクセスの設定方法を、Lambda 関数の例を使用して説明します。他の AWS リソースを使用できますが、リソースを別のアカウントで設定していることを確認してください。
**重要**  
IAM ロールとリソースベースのポリシーは、単一のパーティション内のアカウント間でのみアクセスを委任します。例えば、標準 `aws` パーティションの米国西部 (北カリフォルニア)と、`aws-cn` パーティションの中国 (北京) にアカウントがあるとします。中国 (北京) アカウントの Amazon S3 リソースベースのポリシーを使用して、標準 `aws` アカウントのユーザーにアクセスを許可することはできません。
+ テキストファイルにクロスアカウントリソースの Amazon リソースネーム (ARN) をメモしておきます。このチュートリアルの後半で、この ARN をステートマシンの `Task` 状態定義に入力します。以下は、Lambda 関数の ARN の例です。

  ```
  arn:aws:lambda:us-east-2:{{account-id}}:function:{{functionName}}
  ```
+ ステートマシンが引き受ける必要があるターゲット IAM ロールが作成できたことを確認してください。

## ステップ 1: ターゲットロールを指定するための Task 状態定義を更新する
<a name="tutorial-access-cross-acct-resources-update-task-def"></a>

クロスアカウントの Lambda 関数を呼び出す前に、ワークフローの `Task` 状態で、ステートマシンが引き受ける必要がある `Credentials` フィールド (アイデンティティを含む) を追加します。

次の手順で、クロスアカウント Lambda 関数へのアクセス方法を説明します。`Echo`以下の手順に従って、任意の AWS リソースを呼び出すことができます。

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home?region=us-east-1#/)を開き、**[ステートマシンの作成]** を選択します。

1. **‬[オーサリング方法を選択]‭** ページで **‬[ワークフローを視覚的に設計]‭**‬ を選択し、すべてをデフォルトの選択のままにします。

1. Workflow Studio を開くには、[**次へ**] を選択します。

1. **[アクション]** タブで、`Task` 状態をキャンバスにドラッグアンドドロップします。これで、この `Task` 状態を使用しているクロスアカウントの Lambda 関数が呼び出されます。

1. **[設定]** タブで以下の操作を行います。

   1. 状態の名前を **Cross-account call** に変更します。

   1. **[関数名]** で **[関数名を入力]** を選択し、ボックスに Lambda 関数の ARN を入力します。例えば、`arn:aws:lambda:us-east-2:111122223333:function:{{Echo}}`。

   1. **[IAM ロールの ARN を指定]** でターゲットの IAM ロール ARN を指定します。例えば、`arn:aws:iam::111122223333:role/LambdaRole`。
**ヒント**  
またはその状態の JSON 入力で、IAM ロールの ARN を含む既存の key-value ペアへの[参照パス](amazon-states-language-paths.md#amazon-states-language-reference-paths)も指定できます。これを行うには、**[状態入力からランタイムに IAM ロール ARN を取得する]** を選択します。参照パスを使用して値を指定する例については、[IAM ロール ARN として JSONPath を指定](state-task.md#example-credentials-specify-dynamic-jsonpath)を参照してください。

1. **[次へ]** をクリックします。

1. **[生成されたコードを確認]** ページで **[次へ]** を選択します。

1. **[ステートマシン設定を指定]** ページで、名前、権限、ログレベルなど、新しいステートマシンの詳細を指定します。

1. **[ステートマシンの作成]** を選択します。

1. ステートマシンの IAM ロール ARN とステートマシン ARN をテキストファイルにメモしておきます。ターゲットアカウントの信頼ポリシーで、これらの ARN を指定する必要があります。

`Task` 状態の定義は、以下のようにします。

```
{
  "StartAt": "Cross-account call",
  "States": {
    "Cross-account call": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Credentials": {
        "RoleArn": "arn:aws:iam::111122223333:role/LambdaRole"
      },
      "Parameters": {
        "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:{{Echo}}",
      },
      "End": true
    }
  }
}
```

## ステップ 2：ターゲットロールの信頼ポリシーを更新する
<a name="tutorial-access-cross-acct-resources-update-target-trust-policy"></a>

IAM ロールはターゲットアカウントに存在している必要があるため、ソースアカウントがこのロールを一時的に引き受けられるように、信頼ポリシーを変更する必要があります。さらに、ターゲットの IAM ロールを引き受けられるユーザーを制御できます。

信頼関係を作成すると、ソースアカウントのユーザーは AWS Security Token Service (AWS STS) [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API オペレーションを使用できます。このオペレーションは、ターゲットアカウントの AWS リソースへのアクセスを可能にする一時的なセキュリティ認証情報を提供します。

1. IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. コンソールのナビゲーションペインで、**[ロール]**を選択し、[検索] ボックスでターゲットの IAM ロールを検索します。例えば、`{{LambdaRole}}`。

1. **[信頼関係]** タブを選択します。

1. **[信頼ポリシーを編集]** を選択して、次のポリシーを貼り付けます。 AWS アカウント 番号と IAM ロール ARN を必ず置き換えてください。`sts:ExternalId` フィールドでは、ロールを引き受けられるユーザーをさらに制御できます。ステートマシンの名前には、`AssumeRole`API が AWS Security Token Service サポートする文字のみを含める必要があります。詳細については、「*AWS Security Token Service API リファレンス*」の「[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)」を参照してください。

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "sts:AssumeRole",
         "Principal": {
           "AWS": "arn:aws:iam::{{account-id}}:role/ExecutionRole"  // The source account's state machine execution role ARN
         },
         "Condition": {  // Control which account and state machine can assume the target IAM role
           "StringEquals": {
             "sts:ExternalId": "arn:aws:states:{{region}}:{{account-id}}:stateMachine:testCrossAccount"   //// ARN of the state machine that will assume the role.
           }
         }
       }
     ]
   }
   ```

1. 以降のアクションに進むには、このウィンドウを開いたままで次のステップに進みます。

## ステップ 3: 必要なアクセス許可をターゲットロールに追加する
<a name="tutorial-access-cross-acct-resources-add-permissions"></a>

IAM ポリシーでの許可により、特定のリクエストが許可されるか拒否されるかが決まります。ターゲット IAM ロールには、Lambda 関数を呼び出すための適切なアクセス許可が必要です。

1. **[アクセス許可]** タブを選択します。

1. **[アクセス許可を追加]**、**[インラインポリシーを作成]** の順に選択します。

1. **[JSON]** タブを選択し、既存の内容を次の許可に置き換えます。必ず Lambda 関数の ARN を置き換えてください。

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "lambda:InvokeFunction",
         "Resource": "arn:aws:lambda:us-east-2:111122223333:function:{{Echo}}"  // The cross-account AWS resource being accessed
       }
     ]
   }
   ```

1. **[ポリシーを確認]** を選択します。

1. **[ポリシーを確認]** ページで許可の名前を入力し、**[ポリシーを作成]** を選択します。

## ステップ 4: 実行ロールに権限を追加してターゲットロールを引き受ける
<a name="tutorial-access-cross-acct-resources-update-exec-role"></a>

Step Functions は、すべてのクロスアカウントサービス統合の [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) ポリシーを自動的に生成するわけではありません。ステートマシンが 1 つ以上のターゲット IAM ロールを引き受けられるようにするには、必要な権限をステートマシンの実行ロールに追加する必要があります。 AWS アカウント

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) の IAM コンソール内でステートマシンの実行ロールを開きます。これを実行するには:

   1. [ステップ 1 でソースアカウント内に](#tutorial-access-cross-acct-resources-update-task-def)作成したステートマシンを開きます。

   1. **[ステートマシンの詳細]** ページで、**[IAM ロールの ARN]** を選択します。

1. **[許可]** タブで **[アクセス許可を追加]** を選択し、次に**[インラインポリシーを作成]** を選択します。

1. **[JSON]** タブを選択し、既存の内容を次の許可に置き換えます。必ず Lambda 関数の ARN を置き換えてください。

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "sts:AssumeRole",
         "Resource": "arn:aws:iam::111122223333:role/{{LambdaRole}}"  // The target role to be assumed
       }
     ]
   }
   ```

1. **[ポリシーを確認]** を選択します。

1. **[ポリシーを確認]** ページで許可の名前を入力し、**[ポリシーを作成]** を選択します。