这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
排查 AWS CDK 部署问题
排查部署 AWS 云开发工具包 (AWS CDK) 应用程序时出现的常见问题。
部署时创建的服务主体不正确
在部署包含带有服务主体的 AWS Identity and Access Management (IAM) 角色的 CDK 应用程序时,您发现为服务主体创建的域不正确。
以下是创建 IAM 角色的基本示例,该角色可由 Amazon CloudWatch Logs 使用其服务主体代入:
import * as cdk from 'aws-cdk-lib'; import * as iam from 'aws-cdk-lib/aws-iam'; import { Construct } from 'constructs'; export class MyCdkProjectStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Create an IAM role for CloudWatch Logs to assume const cloudWatchLogsRole = new iam.Role(this, 'CloudWatchLogsRole', { assumedBy: new iam.ServicePrincipal('logs.amazonaws.com'), // This is for CloudWatch Logs managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSCloudWatchLogsFullAccess') ] }); // You can then use this role in other constructs or configurations where CloudWatch Logs needs to assume a role } }
部署此堆栈时,应创建一个名为 logs.amazonaws.com 的服务主体。在大多数情况下,AWS 服务对服务主体使用以下命名:<service>.amazonaws.com。
常见原因
如果您使用的是低于 v2.150.0 的 AWS CDK 版本,则可能会遇到此错误。在较旧的 AWS CDK 版本中,服务主体的命名没有标准化,这可能导致创建的域不正确。
在 AWS CDK v2.51.0 中,通过标准化所有自动创建的服务主体实现了修复,以便尽可能使用 <service>.amazonaws.com。通过使用 @aws-cdk/aws-iam:standardizedServicePrincipals 功能标志,可以修复此问题。
从 AWS CDK v2.150.0 开始,这成为默认行为。
解决方案
升级到 AWS CDK v2.150.0 或更高版本。
如果您无法升级到 AWS CDK v2.150.0 或更高版本,则必须至少升级到 v2.51.0 或更高版本。然后,在 cdk.json 文件中使用以下功能标志:@aws-cdk/aws-iam:standardizedServicePrincipals。