我正在使用aws-cdk中的新pipelines
模块来构建一个多帐户代码管道,将spring引导应用程序部署到beanstall
我遵循了本教程并实现了自己的Cdk.Stage
子类
这个阶段类创建一个新的后端堆栈:
export class BackendStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, artifact: Artifact, props?: cdk.StackProps) {
super(scope, id, props);
const image = new DockerImageAsset(this, 'backend-image', {
directory: path.join(__dirname, '..', '..', '..', 'backend'),
buildArgs: {
'JAR_FILE': './target/app.jar'
},
})
const dockerRunFile = {
"AWSEBDockerrunVersion": "1",
"Ports": [
{
"ContainerPort": 8080,
"HostPort": 8080
}
],
"Image": {
"Name": image.imageUri
}
}
fs.writeFileSync(path.join(__dirname, 'Dockerrun.aws.json'), JSON.stringify(dockerRunFile));
const versionAsset = new Asset(this, 'version-asset', {
path: path.join(__dirname, 'Dockerrun.aws.json')
})
const appVersionProps = new CfnApplicationVersion(this, 'backend-app-version', {
applicationName: appName,
sourceBundle: {
s3Bucket: versionAsset.bucket.bucketName,
s3Key: versionAsset.s3ObjectKey
}
});
}
...
}
不幸的是,image.imageUri解析为Token[TOKEN.219]
,而不是正确的图像URI。我认为这与Cloudformation令牌的解析有关。在我看来,我不得不推迟Dockerrun.aws.json
的创建,但我不知道如何实现这一点。
是否有其他方法可以将资产(如Dockerrun.aws.json
文件(传递到后端堆栈
我需要它来正确部署beanstall应用程序。
正如您正确指出的,令牌的解析发生在CloudFormation内部,因此您无法将其写入文件。有没有一种方法可以不使用真正的文件,而是在CFN中内联提供sourceBundle?然后CDK会在模板中生成一个正确的GetAtt来引用上传的文件。
但请确保您激活了newStyle合成器,这样当它使用硬编码字符串而不是参数时,它可能会工作。你需要新的引导。
请注意,这一切还没有正式开始。
您可以构建这样的图像URL,而不是使用imageUri
:
const account = Stack.of(this).account;
const region = Stack.of(this).region;
const imageName = `${account}.dkr.ecr.${region}.amazonaws.com/${image.repository.repositoryName}:${image.imageTag}`;
确保您允许Elastic Beanstalk访问ECR命令:
role.addManagedPolicy(
ManagedPolicy.fromAwsManagedPolicyName(
'AmazonEC2ContainerRegistryFullAccess',
),
);