

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

# CloudFormation のサービスロール
<a name="service-roles-for-cloudformation"></a>

*サービスロール*は、 がスタックリソースを作成、更新、または削除 AWS CloudFormation できるようにする AWS Identity and Access Management (IAM) ロールです。サービスロールを指定しない場合、CloudFormation は IAM プリンシパルの認証情報を使用してスタックの操作を実行します。CloudFormation のサービスロールを作成してスタック作成時にサービスロールを指定すると、CloudFormation は IAM プリンシパルの認証情報ではなく、サービスロールの認証情報を使用して操作を実行します。

サービスロールを使用する場合、IAM プリンシパルにアタッチされたアイデンティティベースのポリシーには、CloudFormation テンプレートで定義されたすべての AWS リソースをプロビジョニングするためのアクセス許可は必要ありません。開発パイプライン ( AWS 推奨されるベストプラクティス) を通じて重要なビジネスオペレーション用に AWS リソースをプロビジョニングする準備ができていない場合、サービスロールを使用すると、リソース管理に保護レイヤーを追加できます AWS。この方法の利点は以下のとおりです。
+ 組織の IAM プリンシパルは、環境内の AWS リソースを手動で作成または変更できない最小特権モデルに従います。
+  AWS リソースを作成、更新、または削除するには、IAM プリンシパルが CloudFormation を使用する必要があります。これにより、Infrastructure as Code によるリソースのプロビジョニングを標準化できます。

例えば、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを含むスタックを作成する場合、IAM プリンシパルには ID ベースのポリシーを使用して EC2 インスタンスを作成するためのアクセス許可が必要です。その代わりに、プリンシパルに代わって EC2 インスタンスを作成するアクセス許可のあるサービスロールを、CloudFormation が引き受けることができます。この方法なら IAM プリンシパルがスタックを作成できるため、IAM プリンシパルに通常のアクセス権限がないサービスに対して過度に広範なアクセス権限を付与する必要がありません。

サービスロールを使用して CloudFormation スタックを作成するには、IAM プリンシパルは CloudFormation にサービスロールを渡す権限が必要です。また、サービスロールの信頼ポリシーで、CloudFormation がロールを引き受けられるようにする必要があります。

**Topics**
+ [CloudFormation サービスロールに最小特権を実装する](#least-privilege-service-roles)
+ [サービスロールの設定](#configuring-service-roles)
+ [IAM プリンシパルに CloudFormation サービスロールを使用するための許可を付与する](#permissions-use-cloudformation-service-role)
+ [CloudFormation サービスロールの信頼ポリシーを設定する](#trust-policy-cloudformation-service-role)
+ [サービスロールとスタックを関連付ける](#associate-service-role-to-stack)

## CloudFormation サービスロールに最小特権を実装する
<a name="least-privilege-service-roles"></a>

サービスロールでは、そのサービスで実行できるアクションを明示的に指定するアクセス許可ポリシーを定義します。それらは IAM プリンシパルが実行できるアクションと同じではない場合があります。CloudFormation テンプレートから逆算して考え、最小特権の原則に準拠したサービスロールを作成することをお勧めします。

IAM プリンシパルの ID ベースのポリシーを適切に範囲設定して特定のサービスロールのみを渡すようにし、サービスロールの信頼ポリシーを範囲設定して特定のプリンシパルのみがロールを引き受けられるようにすることで、サービスロールを介した権限昇格を防ぐことができます。

## サービスロールの設定
<a name="configuring-service-roles"></a>

**注記**  
サービスロールは IAM で設定されます。サービスロールを作成するには、作成するためのアクセス許可が必要です。ロールを作成し、任意のポリシーをアタッチする権限を持つ IAM プリンシパルは、独自のアクセス許可をエスカレートできます。 AWS では、ユースケースごとに AWS のサービス 1 つのサービスロールを作成することをお勧めします。ユースケースの CloudFormation サービスロールを作成したら、ユーザーが承認されたサービスロールのみを CloudFormation に渡すように許可できます。ユーザーがサービスロールを作成できるようにする ID ベースのポリシーの例については、IAM ドキュメントの「[サービスロールのアクセス許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#id_roles_create_service-permissions)」を参照してください。

サービスロールを作成する手順については、[「 にアクセス許可を委任するロールの作成 AWS のサービス](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)」を参照してください。ロールを引き受けることのできるサービスとして CloudFormation (`cloudformation.amazonaws.com`) を指定します。これにより、IAM プリンシパルがロール自体を引き受けたり、他のサービスにロールを渡したりするのを防止できます。サービスロールを設定するときは、`Effect`、`Action`、`Resource` 要素が必要です。オプションで `Condition` 要素を定義することもできます。

これらの要素の詳細については、「[IAM JSON ポリシー要素のリファレンス](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)」を参照してください。アクション、リソース、状態キーの完全なリストについては、「[Actions, resources, and condition keys for Identity And Access Management](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsidentityandaccessmanagement.html)」を参照してください。

## IAM プリンシパルに CloudFormation サービスロールを使用するための許可を付与する
<a name="permissions-use-cloudformation-service-role"></a>

CloudFormation サービスロールを使用して CloudFormation でリソースをプロビジョニングするには、IAM プリンシパルがサービスロールを渡す権限を持っている必要があります。IAM プリンシパルのアクセス許可でロールの ARN を指定することで、プリンシパルのアクセス許可を制限し、特定のロールのみを渡すようにできます。詳細については、IAM ドキュメントの「[AWS のサービスにロールを渡すアクセス許可をユーザーに付与する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)」を参照してください。

以下の IAM ID ベースポリシーステートメントは、プリンシパルが `cfnroles` パスにあるサービスロールなどのロールを渡せるようにします。このプリンシパルが別のパスにあるロールを渡すことはできません。

```
{ 
"Sid": "AllowPassingAppRoles",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::{{<account ID>}}:role/cfnroles/*" 
}
```

プリンシパルのアクセス許可を特定のロールに制限するもう 1 つの方法は、CloudFormation サービスロール名のプレフィックスを使用することです。以下のポリシーステートメントでは、IAM プリンシパルは `CFN-` プレフィックスを持つロールのみ渡すことができます。

```
{ 
"Sid": "AllowPassingAppRoles",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::{{<account ID>}}:role/CFN-*" 
}
```

前述のポリシーステートメントに加えて、`cloudformation:RoleARN` 条件キーを使用すると、ID ベースのポリシーをさらに詳細にコントロールできるようにして最小特権アクセスを実現できます。以下のポリシーステートメントでは、特定の CloudFormation サービスロールを渡す場合にのみ、IAM プリンシパルがスタックを作成、更新、削除できるようにします。違う方法として、その条件キーで複数の CloudFormation サービスロールの ARN を定義できます。

```
{
  "Sid": "RestrictCloudFormationAccess",
  "Effect": "Allow",
  "Action": [
    "cloudformation:CreateStack",
    "cloudformation:DeleteStack",
    "cloudformation:UpdateStack"
  ],
  "Resource": "arn:aws:iam::{{<account ID>}}:role/CFN-*",
  "Condition": {
    "StringEquals": {
      "cloudformation:RoleArn": [
        "{{<ARN of the specific CloudFormation service role>}}"
      ]
    }
  }
}
```

さらに、`cloudformation:RoleARN`条件キーを使用して、IAM プリンシパルがスタック操作の高い権限を持つ CloudFormation サービスロールを渡さないように制限することもできます。必要なのは条件演算子を `StringEquals` から `StringNotEquals` に変更することだけです。

```
{
  "Sid": "RestrictCloudFormationAccess",
  "Effect": "Allow",
  "Action": [
    "cloudformation:CreateStack",
    "cloudformation:DeleteStack",
    "cloudformation:UpdateStack"
  ],
  "Resource": "arn:aws:iam::{{<account ID>}}:role/CFN-*",
  "Condition": {
    "StringNotEquals": {
      "cloudformation:RoleArn": [
        "{{<ARN of a privilege CloudFormation service role>}}"
      ]
    }
  }
}
```

## CloudFormation サービスロールの信頼ポリシーを設定する
<a name="trust-policy-cloudformation-service-role"></a>

ロール*信頼ポリシー*は、IAM のロールにアタッチされている、リソースベースの必須のポリシーです。信頼ポリシーは、ロールを引き受けることができる IAM プリンシパルを定義します。信頼ポリシーではユーザー、ロール、アカウント、またはサービスをプリンシパルとして指定できます。IAM プリンシパルが CloudFormation のサービスロールを他のサービスに渡すのを防止するため、ロールの信頼ポリシーで CloudFormation をプリンシパルとして指定できます。

以下の信頼ポリシーでは、CloudFormation のみにサービスロールの引き受けを許可しています。

```
{
  "Version": "2012-10-17",		 	 	 		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {
      "Service": "cloudformation.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
  }
}
```

## サービスロールとスタックを関連付ける
<a name="associate-service-role-to-stack"></a>

サービスロールを作成したら、スタックを作成するときにそのロールをスタックに関連付けることができます。詳細については、「[スタックオプションを設定する](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html#configure-stack-options)」を参照してください。サービスロールを指定する前に、IAM プリンシパルにサービスロールを渡すアクセス許可があることを確認します。詳細については、「[IAM プリンシパルに CloudFormation サービスロールを使用するための許可を付与する](#permissions-use-cloudformation-service-role)」を参照してください。