使用 AWS CDK 外观和逃生舱口自定义默认角色名称 - AWS 规范指引

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

使用 AWS CDK 外观和逃生舱口自定义默认角色名称

SANDEEP SINGH 和 James Jacob,Amazon Web Services

Summary

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

先决条件和限制

先决条件

限制

  • Aspects 会根据资源类型来筛选资源,因此所有角色共享相同的前缀。如果您需要为不同的角色添加不同的角色前缀,则需要根据其他属性进行额外筛选。例如,要为与 AWS Lambda 函数关联的角色分配不同的前缀,您可以按特定的角色属性或标签进行筛选,为与 Lambda 相关的角色应用一个前缀,为其他角色应用不同的前缀。

  • IAM 角色名称的最大长度为 64 个字符,因此必须裁剪修改后的角色名称才能满足此限制。

  • 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按区域划分的AWS 服务。有关特定端点,请参阅服务端点和配额页面,然后选择相应服务的链接。

架构

目标技术堆栈

  • AWS CDK

  • AWS CloudFormation

目标架构

使用逃生舱口和方面来自定义 AWS CDK 分配的角色名称的架构。
  • 一个 AWS CDK 应用程序由一个或多个 CloudFormation 堆栈组成,这些堆栈经过合成和部署以管理 AWS 资源。

  • 要修改第 2 层 (L2) 构造未公开的 AWS CDK托管资源的属性,您可以使用逃生舱口来覆盖底层 CloudFormation 属性(在本例中为角色名称),并在 AWS CDK 堆栈合成过程中使用一个方面将该角色应用于 AWS CDK 应用程序中的所有资源。

工具

AWS 服务

  • AWS Cloud Development Kit (AWS CDK)是一个软件开发框架,可帮助您在代码中定义和配置 AWS 云 基础架构。

  • AWS CDK 命令行接口 (AWS CDK CLI)(也称为 AWS CDK Toolkit)是一个命令行云开发套件,可帮助您与 AWS CDK 应用程序进行交互。CLI cdk 命令是与您的 AWS CDK 应用程序交互的主要工具。它运行您的应用程序,查询您定义的应用程序模型,并生成和部署由生成的 CloudFormation 模板。 AWS CDK

  • CloudFormation帮助您设置 AWS 资源,快速一致地配置资源,并在资源的整个生命周期中跨地区对其 AWS 账户 进行管理。

代码存储库

此模式的源代码和模板可在 GitHub CDK Aspects Override 存储库中找到。

最佳实践

请参阅AWS 规范性指南网站上使用 AWS CDK 中的 TypeScript 创建 IaC 项目的最佳实践

操作说明

Task说明所需技能

安装 C AWS CDK LI。

要全局安装 AWS CDK CLI,请运行以下命令:

npm install -g aws-cdk
AWS DevOps

验证 版本。

运行如下命令:

cdk --version

确认您使用的是 AWS CDK CLI 的版本 2。

AWS DevOps

引导 AWS CDK 环境。

在部署 CloudFormation 模板之前,请准备好要 AWS 区域 使用的账户和账户。运行如下命令:

cdk bootstrap <account>/<Region>

有关更多信息,请参阅AWS CDK 文档中的引导。 AWS

AWS DevOps
Task说明所需技能

设置项目。

  1. 将此模式的 GitHub 存储库克隆到您的本地计算机:

    git clone https://github.com/aws-samples/cdk-aspects-override
  2. 在您的本地计算机上,导航到项目目录。

  3. 安装项目依赖项:

    npm ci
AWS DevOps

使用由 AWS CDK分配的默认角色名称部署堆栈。

部署两个包含 Lambda 函数及其关联角色的 CloudFormation 堆栈(ExampleStack1ExampleStack2):

npm run deploy:ExampleAppWithoutAspects

该代码并未显式传递角色属性,因此角色名称将由 AWS CDK构造而成。

有关示例输出,请参阅其他信息部分。

AWS DevOps

使用方面部署堆栈。

在此步骤中,您可以通过为 AWS CDK 项目中部署的所有 IAM 角色添加前缀来应用强制执行角色名称约定的方面。该方面在 lib/aspects.ts 文件中定义。该方面会使用逃生舱口,通过添加前缀来覆盖角色名称。该方面可应用于 bin/app-with-aspects.ts 文件中的堆栈。本示例中使用的角色名称前缀为 dev-unicorn

  1. 编辑 bin/app-with-aspects.ts 文件。

  2. 在文件中,使用前缀 dev-unicorn 更新变量 ROLE_NAME_PREFIX

    const app = new cdk.App(); // Define a prefix for the role names const ROLE_NAME_PREFIX = 'dev-unicorn'; // Instantiate the RoleNamingConventionAspect with the desired prefix const roleNamingConventionAspect = new RoleNamingConventionAspect(ROLE_NAME_PREFIX);
  3. 通过以下方面部署 AWS CDK 应用程序:

    npm run deploy:ExampleAppWithAspects

有关示例输出,请参阅其他信息部分。

AWS DevOps
Task说明所需技能

删除您的 AWS CloudFormation 堆栈。

使用完此模式后,请运行以下命令清理资源,以避免产生额外费用:

cdk destroy --all -f && cdk --app npx ts-node bin/app-with-aspects.ts' destroy --all -f
AWS DevOps

问题排查

问题解决方案

您在使用时遇到问题 AWS CDK。

请参阅 AWS CDK 文档中的常见 AWS CDK 问题疑难解答

相关资源

附加信息

由 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