CDK如何将预构建实例配置文件附加到Cloud9实例IAM角色
问题说明
目前CDK的cloud9.Ec2Environment L2构造、以及底层对应的CloudFormation AWS::Cloud9::EnvironmentEC2资源,均未原生支持指定EC2实例关联的自定义IAM实例配置文件。这不是功能暂未上线,是CloudFormation对该资源的定义本身就没有开放这个配置项,和CDK的封装逻辑无关。
不需要从零编写Lambda、搭建完整自定义资源框架实现这个需求,用CDK内置的AwsCustomResource即可用极低的代码量完成配置:CDK会自动创建执行角色、托管Lambda运行时、处理自定义资源的创建/更新/删除生命周期,没有额外的维护成本。
实现步骤
保留你现有创建IAM角色、实例配置文件、VPC、Cloud9环境的代码,补充以下逻辑即可:
- 引入需要的依赖包
import { Duration } from 'aws-cdk-lib'; import * as cr from 'aws-cdk-lib/custom-resources'; import * as logs from 'aws-cdk-lib/aws-logs';
- 添加自定义资源,自动查询Cloud9创建的EC2实例ID并绑定指定实例配置文件
// 查询Cloud9环境对应的EC2实例ID const getC9Instance = new cr.AwsCustomResource(this, 'GetC9Ec2Instance', { onCreate: { service: 'EC2', action: 'describeInstances', parameters: { Filters: [ { Name: 'tag:aws:cloud9:environment', Values: [c9Env.environmentId] }, { Name: 'instance-state-name', Values: ['running'] } ] }, outputPaths: ['Reservations.0.Instances.0.InstanceId'], physicalResourceId: cr.PhysicalResourceId.of('C9InstanceLookup'), totalTimeout: Duration.minutes(5), // 等待Cloud9异步创建EC2实例,最长等待5分钟 }, onUpdate: { service: 'EC2', action: 'describeInstances', parameters: { Filters: [ { Name: 'tag:aws:cloud9:environment', Values: [c9Env.environmentId] }, { Name: 'instance-state-name', Values: ['running'] } ] }, outputPaths: ['Reservations.0.Instances.0.InstanceId'], physicalResourceId: cr.PhysicalResourceId.of('C9InstanceLookup'), totalTimeout: Duration.minutes(5), }, policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE, }), logRetention: logs.RetentionDays.ONE_WEEK, }); // 为查询到的EC2实例绑定自定义实例配置文件 const attachProfile = new cr.AwsCustomResource(this, 'AttachInstanceProfile', { onCreate: { service: 'EC2', action: 'associateIamInstanceProfile', parameters: { IamInstanceProfile: { Name: c9InstanceProfile.ref }, InstanceId: getC9Instance.getResponseField('Reservations.0.Instances.0.InstanceId') }, physicalResourceId: cr.PhysicalResourceId.fromResponse('IamInstanceProfileAssociation.AssociationId'), }, onUpdate: { service: 'EC2', action: 'associateIamInstanceProfile', parameters: { IamInstanceProfile: { Name: c9InstanceProfile.ref }, InstanceId: getC9Instance.getResponseField('Reservations.0.Instances.0.InstanceId') }, physicalResourceId: cr.PhysicalResourceId.fromResponse('IamInstanceProfileAssociation.AssociationId'), }, policy: cr.AwsCustomResourcePolicy.fromStatements([ new iam.PolicyStatement({ actions: ['ec2:AssociateIamInstanceProfile', 'ec2:ReplaceIamInstanceProfileAssociation'], resources: ['*'], }) ]), }); // 强制依赖顺序:Cloud9环境、实例配置文件创建完成后再执行绑定 attachProfile.node.addDependency(c9Env, c9InstanceProfile);
补充说明
- Cloud9拉起EC2实例时会默认绑定一个服务托管的实例配置文件,上述绑定操作会直接覆盖默认配置,不会产生资源冲突
- 配置的5分钟超时足够覆盖Cloud9创建EC2实例的异步等待时间,不需要额外编写重试逻辑
- 如果你后续需要更新实例绑定的角色,直接更新
c9IamRole的权限或替换实例配置文件,CDK会自动重新执行绑定逻辑
内容的提问来源于stack exchange,提问作者unacorn
相关产品推荐
相关产品推荐

