And*_*rea 4 amazon-web-services aws-cloudformation aws-codecommit aws-codepipeline aws-cdk
我需要使用 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,
}),
],
});
Run Code Online (Sandbox Code Playgroud)
但是,如果 CodeCommit 存储库位于不同的帐户中怎么办?
我尝试重新创建的架构与本文中显示的架构类似(下图),但使用了 CDK 和 CloudFormation。
我怎样才能创建它?
如果有人有同样的问题,我可以通过这个例子用 CDK 来解决。它已经过时了,但我应用了相同的逻辑。由于最近的变化,这个答案中提到的一些步骤可能是不必要的。我在这里找到了一个更新的例子,但我还没有尝试过。
让我们通过 CodeCommit 存储库调用 ID_ACC_WITH_REPO 到 AWS 账户 ID,并通过管道和我们想要部署架构的位置调用 ID_ACC_WITH_PIPELINE 到账户 ID。
const repoAccStack = new cdk.Stack(app, 'RepoAccStack', {
env: {
account: ID_ACC_WITH_REPO,
region: REPO_REGION
}
});
Run Code Online (Sandbox Code Playgroud)
// 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);
Run Code Online (Sandbox Code Playgroud)
const repo = codecommit.Repository.fromRepositoryArn(
repoAccStack,
'AppRepository',
`arn:aws:codecommit:${REPO_REGION}:${ID_ACC_WITH_REPO}:${REPO_NAME}`
);
Run Code Online (Sandbox Code Playgroud)
const repo = codecommit.Repository.fromRepositoryArn(
repoAccStack,
'AppRepository',
`arn:aws:codecommit:${REPO_REGION}:${ID_ACC_WITH_REPO}:${REPO_NAME}`
);
Run Code Online (Sandbox Code Playgroud)
EncryptionKey示例中使用的方法已被弃用,请Key改用。const pipelineAccStack = new cdk.Stack(app, 'PipelineAccStack', {
env: {
account: ID_ACC_WITH_PIPELINE,
region: REGION_WITH_PIPELINE
}
});
Run Code Online (Sandbox Code Playgroud)
实际上,我kms.model.MalformedPolicyDocumentException在尝试创建密钥时遇到了错误,因此我从 AWS 控制台手动创建密钥,然后使用kms.Key.fromKeyArn. 我的帐户可能出了问题(在使用此解决方案之前我遇到了很多错误),但如果您遇到相同的错误,这是一个解决方法。只需确保为管道角色分配使用权限即可。
HackyIdentity示例中使用的方法不是必需的,类实现中使用的几种方法现已弃用。const key = new kms.Key(pipelineAccStack, 'CrossAccountKmsKey');
Run Code Online (Sandbox Code Playgroud)
const artifactsBucket = new s3.Bucket(pipelineAccStack, "ArtifactsBucket", {
bucketName: BUCKET_NAME,
encryptionKey: key,
encryption: s3.BucketEncryption.KMS
});
artifactsBucket.grantReadWrite(new iam.ArnPrincipal(crossAccRole.roleArn));
Run Code Online (Sandbox Code Playgroud)
// 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);
Run Code Online (Sandbox Code Playgroud)
// 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
})
]
});
Run Code Online (Sandbox Code Playgroud)
当 CDK 应用程序包含多个堆栈时,您不能只是cdk deploy. 此处对此进行了解释。但是,如果您尝试这样做,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.
考虑到所有这些,在本例中我将部署:
// 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],
}),
],
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3346 次 |
| 最近记录: |