

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

# 使用 AWS CDK 外观和逃生舱口自定义默认角色名称
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches"></a>

*SANDEEP SINGH 和 James Jacob，Amazon Web Services*

## Summary
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-summary"></a>

此模式演示如何自定义由 AWS Cloud Development Kit (AWS CDK) 构造创建的角色的默认名称。如果根据命名约定，您的组织具有特定约束，则通常需要自定义角色名称。例如，您的组织可能会设置 AWS Identity and Access Management (IAM) [权限边界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)或[服务控制策略 (SCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)，要求在角色名称中使用特定的前缀。在这种情况下，由 AWS CDK 构造生成的默认角色名称可能不符合这些约定，因此可能需要更改。此模式通过在 AWS CDK中使用[逃生舱口](https://docs.aws.amazon.com/cdk/v2/guide/cfn-layer.html)和[方面](https://docs.aws.amazon.com/cdk/v2/guide/aspects.html)来满足这些要求。您可以使用逃生舱口来定义自定义角色名称，并使用方面来将自定义名称应用于所有角色，以确保遵守组织的策略和约束。

## 先决条件和限制
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ [AWS CDK 文档](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)中指定的先决条件

**限制**
+ Aspects 会根据资源类型来筛选资源，因此所有角色共享相同的前缀。如果您需要为不同的角色添加不同的角色前缀，则需要根据其他属性进行额外筛选。例如，要为与 AWS Lambda 函数关联的角色分配不同的前缀，您可以按特定的角色属性或标签进行筛选，为与 Lambda 相关的角色应用一个前缀，为其他角色应用不同的前缀。
+ IAM 角色名称的最大长度为 64 个字符，因此必须裁剪修改后的角色名称才能满足此限制。
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

## 架构
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-architecture"></a>

**目标技术堆栈**
+ AWS CDK
+ AWS CloudFormation

**目标架构**

![使用逃生舱口和方面来自定义 AWS CDK 分配的角色名称的架构。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/c149d8d2-1da6-4680-ab0b-e5051b69688c/images/15e56ca5-f150-4522-b374-8ee2dcc655a9.png)

+ 一个 AWS CDK 应用程序由一个或多个 CloudFormation 堆栈组成，这些堆栈经过合成和部署以管理 AWS 资源。
+ 要修改第 2 层 (L2) 构造未公开的 AWS CDK托管资源的属性，您可以使用逃生舱口来覆盖底层 CloudFormation 属性（在本例中为角色名称），并在 AWS CDK 堆栈合成过程中使用一个方面将该角色应用于 AWS CDK 应用程序中的所有资源。

## 工具
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-tools"></a>

**AWS 服务**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html)是一个软件开发框架，可帮助您在代码中定义和配置 AWS Cloud 基础架构。
+ [AWS CDK 命令行接口 (AWS CDK CLI)](https://docs.aws.amazon.com/cdk/latest/guide/cli.html)（也称为 AWS CDK Toolkit）是一个命令行云开发套件，可帮助您与 AWS CDK 应用程序进行交互。CLI `cdk` 命令是与您的 AWS CDK 应用程序交互的主要工具。它运行您的应用程序，查询您定义的应用程序模型，并生成和部署由生成的 CloudFormation 模板。 AWS CDK
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您设置 AWS 资源，快速一致地配置资源，并在资源的整个生命周期中跨地区对其 AWS 账户 进行管理。

**代码存储库**

此模式的源代码和模板可在 GitHub [CDK Aspects Override](https://github.com/aws-samples/cdk-aspects-override) 存储库中找到。

## 最佳实践
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-best-practices"></a>

请参阅**AWS **规范性指南[网站上使用 AWS CDK 中的 TypeScript 创建 IaC 项目的最佳实践](https://docs.aws.amazon.com/prescriptive-guidance/latest/best-practices-cdk-typescript-iac/introduction.html)。

## 操作说明
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-epics"></a>

### 安装 AWS CDK CLI
<a name="install-the-cdk-cli"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 C AWS CDK LI。 | 要全局安装 AWS CDK CLI，请运行以下命令：<pre>npm install -g aws-cdk</pre> | AWS DevOps | 
| 验证 版本。 | 运行如下命令：<pre>cdk --version</pre><br />确认您使用的是 AWS CDK CLI 的版本 2。 | AWS DevOps | 
| 引导 AWS CDK 环境。 | 在部署 CloudFormation 模板之前，请准备好要 AWS 区域 使用的账户和账户。运行如下命令：<pre>cdk bootstrap <account>/<Region></pre><br />有关更多信息，请参阅[AWS CDK 文档中的引导](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html)。 AWS  | AWS DevOps | 

### 部署 AWS CDK 应用程序以演示各方面的用法
<a name="deploy-the-cdk-app-to-demonstrate-the-use-of-aspects"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置项目。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches.html) | AWS DevOps | 
| 使用由 AWS CDK分配的默认角色名称部署堆栈。 | 部署两个包含 Lambda 函数及其关联角色的 CloudFormation 堆栈（`ExampleStack1`和`ExampleStack2`）：<pre>npm run deploy:ExampleAppWithoutAspects</pre><br />该代码并未显式传递角色属性，因此角色名称将由 AWS CDK构造而成。<br />有关示例输出，请参阅[其他信息](#customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-additional)部分。 | AWS DevOps | 
| 使用方面部署堆栈。 | 在此步骤中，您可以通过为 AWS CDK 项目中部署的所有 IAM 角色添加前缀来应用强制执行角色名称约定的方面。该方面在 `lib/aspects.ts` 文件中定义。该方面会使用逃生舱口，通过添加前缀来覆盖角色名称。该方面可应用于 `bin/app-with-aspects.ts` 文件中的堆栈。本示例中使用的角色名称前缀为 `dev-unicorn`。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches.html)<br />有关示例输出，请参阅[其他信息](#customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-additional)部分。 | AWS DevOps | 

### 清理 资源
<a name="clean-up-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除您的 AWS CloudFormation 堆栈。 | 使用完此模式后，请运行以下命令清理资源，以避免产生额外费用：<pre>cdk destroy --all -f && cdk --app npx ts-node bin/app-with-aspects.ts' destroy --all -f </pre> | AWS DevOps | 

## 问题排查
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 您在使用时遇到问题 AWS CDK。 | 请参阅 AWS CDK 文档中的[常见 AWS CDK 问题疑难解答](https://docs.aws.amazon.com/cdk/v2/guide/troubleshooting.html)。 | 

## 相关资源
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-resources"></a>
+ [AWS Cloud Development Kit (AWS CDK)](https://aws.amazon.com/cdk/)
+ [AWS CDK 文档](https://docs.aws.amazon.com/cdk/)
+ [AWS CDK on GitHub](https://github.com/aws/aws-cdk)
+ [逃生舱口](https://docs.aws.amazon.com/cdk/v2/guide/cfn-layer.html)
+ [方面和 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/aspects.html)

## 附加信息
<a name="customize-default-role-names-by-using-aws-cdk-aspects-and-escape-hatches-additional"></a>

**由 CloudFormation 不带任何方面创建的角色名称**

```
Outputs:
ExampleStack1WithoutAspects.Function1RoleName = example-stack1-without-as-Function1LambdaFunctionSe-y7FYTY6FXJXA
ExampleStack1WithoutAspects.Function2RoleName = example-stack1-without-as-Function2LambdaFunctionSe-dDZV4rkWqWnI
...

Outputs:
ExampleStack2WithoutAspects.Function3RoleName = example-stack2-without-as-Function3LambdaFunctionSe-ygMv49iTyMq0
```

**由 CloudFormation 使用方面创建的角色名称**

```
Outputs:
ExampleStack1WithAspects.Function1RoleName = dev-unicorn-Function1LambdaFunctionServiceRole783660DC
ExampleStack1WithAspects.Function2RoleName = dev-unicorn-Function2LambdaFunctionServiceRole2C391181
...

Outputs:
ExampleStack2WithAspects.Function3RoleName = dev-unicorn-Function3LambdaFunctionServiceRole4CAA721C
```