

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 IaC 强制执行 “必需的标签密钥”
<a name="enforce-required-tag-keys-iac"></a>

标签策略可帮助您在基础设施即代码 (IaC) 部署中保持一致的标记。使用 “必填标签密钥”，您可以确保通过 IaC 工具（例如 CloudFormation Terraform 和 Pulumi）创建的所有资源都包含组织定义的强制性标签。

在创建资源之前，此功能会根据组织的标签策略检查您的 IaC 部署。当部署缺少必需的标签时，您可以将 IaC 设置配置为警告开发团队或完全阻止部署。这种积极主动的方法从创建资源的那一刻起就保持了标签合规性，而不必在以后需要手动修复。使用单一标签策略定义跨多个 IaC 工具强制执行，无需为组织使用的每种工具配置单独的标记规则。

**Topics**
+ [强制执行 CloudFormation](#enforce-with-cloudformation)
+ [使用 Terraform 强制执行](#enforce-with-terraform)
+ [使用 Pulumi 强制执行](#enforce-with-pulumi)

## 强制执行 CloudFormation
<a name="enforce-with-cloudformation"></a>

**注意**  
要使用强制使用所需的标签密钥 CloudFormation，您必须在标签策略中为资源类型指定必需的标签。有关更多详细信息，请参阅[报告 “必需的标签密钥”](orgs_manage_policies_tag-policies-report-tagging-compliance.md#reporting-required-tag-key) 一节。

 **为 AWS::TagPolicies: TaggingComplianceValidator Hook 设置执行角色** 

在激活`AWS::TagPolicies::TaggingComplianceValidator`挂钩之前，必须创建挂钩用来访问 AWS 服务的执行角色。该角色必须附加以下信任策略：

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

执行角色还必须具有至少具有以下权限的角色策略：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "tag:ListRequiredTags"
            ],
            "Resource": "*"
        }
    ]
}
```

有关为公共扩展设置执行角色的更多信息，请参阅 CloudFormation 用户指南中的[使用 IAM 权限配置执行角色和公有扩展访问权限的信任策略](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry-public.html#registry-public-enable-execution-role)。

 **激活 AWS:::TagPolicies: TaggingComplianceValidator Hook** 

**重要**  
在继续操作之前，请确认您拥有使用 Hook 所需的权限，并从控制 CloudFormation 台查看主动控件。有关更多信息，请参阅[授予 CloudFormation Hook 的 IAM 权限](https://docs.aws.amazon.com/cloudformation-cli/latest/hooks-userguide/grant-iam-permissions-for-hooks.html)。

更新标签策略后，您必须在要强制执行所需标签合规性的每个 AWS 账户和区域中激活该`AWS::TagPolicies::TaggingComplianceValidator`挂钩。

这个 AWS托管挂钩可以在两种模式下配置：
+  **警告模式**：允许继续部署，但在缺少所需标签时会生成警告 
+  **失败模式**：阻止缺少必需标签的部署 

要使用 AWS CLI 激活挂钩，请执行以下操作：

```
aws cloudformation activate-type \
    --type HOOK \
    --type-name AWS::TagPolicies::TaggingComplianceValidator \
    --execution-role-arn arn:aws:iam::123456789012:role/MyHookExecutionRole \
    --publisher-id aws-hooks \
    --region us-east-1
```

```
aws cloudformation set-type-configuration \
  --configuration '{"CloudFormationConfiguration":{"HookConfiguration":{"HookInvocationStatus": "ENABLED", "FailureMode": "WARN", "TargetOperations": ["STACK"], "Properties":{}}}}' \
  --type-arn "arn:aws:cloudformation:us-east-1:123456789012:type/hook/AWS-TagPolicies-TaggingComplianceValidator" \
  --region us-east-1
```

`region`替换为目标 AWS 区域，`"FailureMode":"WARN"`如果您更喜欢警告模式，请更改`"FailureMode":"FAIL"`为。

 **使用 AWS以下方式激活:TagPolicies::: 跨多个账户和区域的TaggingComplianceValidator 挂钩 CloudFormation StackSets** 

对于拥有多个 AWS 账户的组织，您可以使用 AWS CloudFormation StackSets 在所有账户和地区同时激活标签合规性挂钩。

CloudFormation StackSets 允许您通过一次操作将同一个 CloudFormation 模板部署到多个账户和区域。这种方法可确保在整个 AWS 组织中实现一致的标签强制执行，而无需在每个账户中进行手动配置。

要 CloudFormation StackSets 用于此目的，请执行以下操作：

1. 创建激活标签合规性挂钩的 CloudFormation 模板

1. 使用部署模板 CloudFormation StackSets 来定位您的组织单位或特定客户

1. 指定要在其中启用强制措施的所有区域

该 CloudFormation StackSets 部署将自动处理所有指定账户和地区的激活流程，从而确保整个组织内统一的标签合规性。要了解如何将 CloudFormation Hook 部署到具有服务管理功能的组织 CloudFormation StackSets，请参阅此[AWS 博客](https://aws.amazon.com/blogs/devops/deploy-cloudformation-hooks-to-an-organization-with-service-managed-stacksets/)。

 *使用以下 CloudFormation 模板 CloudFormation StackSets 为组织中的账户激活 AWS TagPolicies:::: TaggingComplianceValidator Hook。*

**重要**  
这个钩子只能用作 StackHook. 当用作资源挂钩时，它没有任何效果。

```
Resources:
  # Activate the AWS-managed hook type
  HookTypeActivation:
    Type: AWS::CloudFormation::TypeActivation
    Properties:
        AutoUpdate: True
        PublisherId: "AWS"
        TypeName: "AWS::TagPolicies::TaggingComplianceValidator"
  
  # Configure the hook
  HookTypeConfiguration:
    Type: AWS::CloudFormation::HookTypeConfig
    DependsOn: HookTypeActivation
    Properties:
      TypeName: "AWS::TagPolicies::TaggingComplianceValidator"
      TypeArn: !GetAtt HookTypeActivation.Arn
      Configuration: !Sub |
        {
          "CloudFormationConfiguration": {
            "HookConfiguration": {
              "TargetStacks": "ALL",
              "TargetOperations": ["STACK"],
              "Properties": {},
              "FailureMode": "Warn",
              "TargetFilters": {
                "Actions": [
                    "CREATE",
                    "UPDATE"
                ]}
            }
          }
        }
```

**注意**  
有关运行 CloudFormation 挂钩的更多信息，请参阅在[账户中激活基于主动控制的挂钩](https://docs.aws.amazon.com/cloudformation-cli/latest/hooks-userguide/proactive-controls-hooks-activate-hooks.html)。

## 使用 Terraform 强制执行
<a name="enforce-with-terraform"></a>

要使用 Terraform 强制执行所需的标签密钥，您需要将 Terraform AWS 提供程序更新到 6.22.0 或更高版本，并在提供程序配置中启用标签策略验证。有关实现细节和配置示例，请参阅有关[标签策略实施的 Terraform Prov AWS ider 文档](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/tag-policy-compliance)。

## 使用 Pulumi 强制执行
<a name="enforce-with-pulumi"></a>

要使用 Pulumi 强制执行所需的标签密钥，您需要在 Pulumi Cloud 中启用标签策略报告策略包，并使用标签策略读取权限配置您的 IAM 角色。有关实现细节和配置示例，请参阅 [Pulumi 关于标签策略实施的文档](https://www.pulumi.com/docs/insights/policy/integrations/aws-organizations-tag-policies/#aws-organizations-tag-policies)。