

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# CloudFormation 的服務角色
<a name="service-roles-for-cloudformation"></a>

*服務角色*是 AWS Identity and Access Management (IAM) 角色， AWS CloudFormation 允許 建立、更新或刪除堆疊資源。如果您不提供服務角色，CloudFormation 會使用 IAM 主體的登入資料來執行堆疊操作。如果您為 CloudFormation 建立服務角色，並在堆疊建立期間指定服務角色，則 CloudFormation 會使用服務角色的登入資料來執行操作，而非 IAM 主體的登入資料。

使用服務角色時，連接至 IAM 主體的身分型政策不需要佈建 CloudFormation 範本中定義之所有 AWS 資源的許可。如果您尚未準備好透過開發管道 ( AWS 建議的最佳實務） 為關鍵業務操作佈建 AWS 資源，使用服務角色可以為資源管理新增額外的保護層 AWS。此方法的優點如下：
+ 組織中的 IAM 主體遵循最低權限模型，以防止他們手動在您的環境中建立或變更 AWS 資源。
+ 若要建立、更新或刪除 AWS 資源，IAM 主體必須使用 CloudFormation。這會將透過基礎設施的資源佈建標準化為程式碼。

例如，若要建立包含 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的堆疊，IAM 主體需要具有透過身分型政策建立 EC2 執行個體的許可。反之，CloudFormation 可以擔任服務角色，該角色具有代表委託人建立 EC2 執行個體的許可。透過這種方法，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 主體的身分型政策，以僅傳遞特定服務角色，並限定服務角色的信任政策，以僅允許特定主體擔任該角色，有助於防止透過服務角色提升可能的權限。

## 設定服務角色
<a name="configuring-service-roles"></a>

**注意**  
服務角色是在 IAM 中設定。若要建立服務角色，您必須具有執行此作業的許可。具有建立角色和連接任何政策許可的 IAM 主體可以提升自己的許可。 AWS 建議 AWS 服務 為每個使用案例為每個 建立一個服務角色。為您的使用案例建立 CloudFormation 服務角色之後，您可以允許使用者僅將核准的服務角色傳遞給 CloudFormation。如需允許使用者建立服務角色的身分型政策範例，請參閱 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)。如需動作、資源和條件索引鍵的完整清單，請參閱 [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 主體必須具有傳遞服務角色的許可。您可以在委託人的許可中指定角色的 ARN，將 IAM 委託人的許可限制為僅傳遞特定角色。如需詳細資訊，請參閱 IAM 文件中的[授予使用者將角色傳遞至 的許可 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

下列 IAM 身分型政策陳述式允許主體傳遞`cfnroles`路徑中的角色，包括服務角色。委託人無法傳遞位於不同路徑中的角色。

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

將主體限制為特定角色的另一種方法是使用 CloudFormation 服務角色名稱的字首。下列政策陳述式允許 IAM 主體僅傳遞具有`CFN-`字首的角色。

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

除了先前的政策陳述式之外，您還可以使用 `cloudformation:RoleARN`條件金鑰，在身分型政策中提供進一步的精細控制，以實現最低權限存取。下列政策陳述式僅允許 IAM 主體在傳遞特定 CloudFormation 服務角色時建立、更新和刪除堆疊。作為一種變化，您可以在條件索引鍵中定義多個 CloudFormation 服務角色的 ARNs。

```
{
  "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)。