我需要使用CDK创建一个管道,该管道将基于CodeCommit存储库中的分支触发CloudFormation中的部署。如果CodeCommit存储库与管道位于同一帐户中,我将使用类似以下内容:
const codecommitRepo = codecommit.Repository.fromRepositoryName(
this,
'AppRepository',
'REPO_NAME'
);
pipeline.addStage({
stageName: 'Source',
actions: [
new codepipeline_actions.CodeCommitSourceAction({
actionName: 'Source',
repository: codecommitRepo,
branch: 'BRANCH_NAME',
output: sourceArtifact,
}),
],
});
但是,如果CodeCommit存储库位于另一个帐户中怎么办?
我要重新创建的架构类似于this article(下图)中所示的架构,但是具有CDK和CloudFormation。
如何创建它?
答案 0 :(得分:0)
CodePipeline(CP)都在同一帐户中时,它们会通过 CloudWatch Event规则由CC触发:
CC ---> CW Event rule ---> CP
要在整个帐户中进行此操作,您必须调整CW事件。即,CC帐户中的CW事件规则必须将事件转发到CP帐户中的CW事件:
CP ---> CW Event rule ---> CW Event bus in CP acc ---> CW rule --> CP
我没有适合您的代码,但这是应该做的。您提供的链接提供了该体系结构的更多详细信息。
我猜想在使用CDK时,您将必须“手动”创建所有CW事件规则,因为通常这不是开箱即用的事情。
答案 1 :(得分:0)
如果有人遇到相同的问题,我可以通过this example用CDK来解决。它已经过时,但我采用了相同的逻辑。由于最近的更改,此答案中提到的某些步骤可能不是必需的。我找到了最近的示例here,但是我还没有尝试过。
让我们将ID_ACC_WITH_REPO调用具有CodeCommit存储库的AWS账户ID,并将ID_ACC_WITH_PIPELINE调用具有管道以及我们要在其中部署架构的账户ID。
const repoAccStack = new cdk.Stack(app, 'RepoAccStack', {
env: {
account: ID_ACC_WITH_REPO,
region: REPO_REGION
}
});
// Create role
const crossAccRole = new iam.Role(repoAccStack, 'OtherAccRole', {
roleName: 'CrossAccountRole',
assumedBy: new iam.AccountPrincipal(pipelineAcc),
});
// Attach policies
const policy = new iam.PolicyStatement();
policy.addAllResources();
policy.addActions('s3:*', 'codecommit:*', 'kms:*');
crossAccRole.addToPolicy(policy);
const repo = codecommit.Repository.fromRepositoryArn(
repoAccStack,
'AppRepository',
`arn:aws:codecommit:${REPO_REGION}:${ID_ACC_WITH_REPO}:${REPO_NAME}`
);
const pipelineAccStack = new cdk.Stack(app, 'PipelineAccStack', {
env: {
account: ID_ACC_WITH_PIPELINE,
region: REGION_WITH_PIPELINE
}
});
EncryptionKey
已过时,请改用Key
。const key = new kms.Key(pipelineAccStack, 'CrossAccountKmsKey');
实际上,尝试创建密钥时出现了kms.model.MalformedPolicyDocumentException
错误,因此我是从AWS控制台手动完成的,然后使用kms.Key.fromKeyArn
进行了导入。我的帐户可能做错了什么(在使用此解决方案之前,我有很多错误),但是如果遇到同样的错误,这是一种解决方法。只需确保将使用权限分配给管道角色即可。
HackyIdentity
是不必要的,该类实现中使用的几种方法现已弃用。const artifactsBucket = new s3.Bucket(pipelineAccStack, "ArtifactsBucket", {
bucketName: BUCKET_NAME,
encryptionKey: key,
encryption: s3.BucketEncryption.KMS
});
artifactsBucket.grantReadWrite(new iam.ArnPrincipal(crossAccRole.roleArn));
// Create pipeline
const pipeline = new codepipeline.Pipeline(pipelineAccStack, 'Pipeline', {
pipelineName: 'CrossAccountPipeline',
artifactBucket: artifactsBucket
});
// Add cross-account role
const policy = new iam.PolicyStatement();
policy.addResources(crossAccRole.roleArn)
policy.addActions('s3:*', 'codecommit:*', 'kms:*');
pipeline.addToRolePolicy(policy);
// Create artifact for source code
const sourceArtifact = new codepipeline.Artifact();
// Create source stage with role
pipeline.addStage({
stageName: 'Source',
actions: [
new codepipeline_actions.CodeCommitSourceAction({
actionName: 'CodeCommit_Source',
repository: repo,
output: sourceArtifact,
branch: 'dev',
role: crossAccRole
})
]
});
// Create CodeBuild project
const buildProject = new codebuild.PipelineProject(this, 'Build', {
environment: { buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_2 }
});
// Create artifact for build
const buildArtifact = new codepipeline.Artifact();
// Add build stage
pipeline.addStage({
stageName: 'Build',
actions: [
new codepipeline_actions.CodeBuildAction({
actionName: 'Build',
project: buildProject,
input: sourceArtifact,
outputs: [buildArtifact],
}),
],
});
当CDK应用程序包含多个堆栈时,您不仅会cdk deploy
。 here中对此进行了说明。但是,如果您尝试cdk deploy '*'
,则会出现另一个错误:Need to perform AWS calls for account ACCOUNT_ID, but the current credentials are for ACCOUNT_ID
。
我设法用cdk deploy -e
部署堆栈,并用aws configure
切换帐户。
一共有三叠,而不是两叠。 CDK自动生成EventBusPolicy堆栈,以创建事件总线。 CDK在PipelineAccStack和RepoAccStack中添加了其他两个事件(也自动)。 Marcin的答案说明了如何配置跨帐户事件。应该在ACC_WITH_PIPELINE中创建EventBusPolicy堆栈。要获取堆栈的确切名称,请使用cdk list
。
考虑到所有这些因素,在此示例中,我将部署:
# with aws configure in ACC_WITH_PIPELINE
cdk deploy -e "PipelineAccStack"
cdk deploy -e "EventBusPolicy-$ID_ACC_WITH_REPO-$REGION-$ID_ACC_WITH_PIPELINE"
# switch aws configure to ACC_WITH_REPO
cdk deploy -e "RepoAccStack"