[英]AWS CDK - DockerImageAsset - How to use published ECR image in a downstream image?
我们目前拥有下游容器从中提取的“基础映像”,并且我们正在使用aws-cdk-lib/aws-ecr-assets
从定制 CDK 管道升级到简单的 CDK 管道。 我们一直通过使用 SSM 共享这些基础图像的 URI 来做到这一点,因为它们位于不同的项目和堆栈中。
我一直在尝试通过将 SSM 导入下游堆栈并将 URI 作为 Buildarg 传递来做到这一点,但我遇到了“无法在“buildArgs”的键或值中使用令牌,因为在部署之前需要它们”,其中根据 issue #3981是预期的。
这让我觉得我做错了,但我不确定实现这一目标的最佳做法是什么? 我正在通过对存储在 SSM 中的 URL 进行硬编码来解决这个问题,显然我可以预先获取它并在运行时将其传递给它,但这似乎很笨拙。
我试图实现的架构是这样的:
上游堆栈:
const pythonDocker = new DockerImageAsset(this, 'python-3-base-image', {
directory: join(thisDirectoryInSrc, '/python-3'),
ignoreMode: IgnoreMode.DOCKER,
});
new StringParameter(this, 'python3-ecr-arn-ssm', {
stringValue: pythonDocker.imageUri,
description: 'Python 3 image repository URI',
parameterName: '/docker-images/python-3/image-uri',
});
下游堆栈:
const baseImage = StringParameter.fromStringParameterName(this, 'python-3-base-image', '/docker-images/python-3/image-uri');
const feedReaderDocker = ContainerImage.fromAsset('src/feed-reader', {
ignoreMode: IgnoreMode.DOCKER,
buildArgs: {
BASE_IMAGE: baseImage.stringValue
},
});
下游 Dockerfile:
ARG BASE_IMAGE
FROM BASE_IMAGE
# Install dependencies, declare entry point, etc
TL;DR使用上下文。 StringParameter.valueFromLookup
“上下文方法”可以在合成时检索和缓存先前部署的参数值。
如您所见, StringParameter.fromStringParameterName
在部署时解析。 但是ContainerImage.fromAsset
在合成时需要解析的基本图像值。 CDK 为我们提供了此用例的运行时上下文:
AWS CDK 支持多种上下文方法,使 AWS CDK 应用程序能够从 AWS 环境中获取上下文信息……如果所需的上下文值不可用,AWS CDK 应用程序会通知 CDK 工具包缺少上下文信息。 然后 CLI 查询当前 AWS 账户的信息,将生成的上下文信息存储在 cdk.context.json 文件中
StringParameter.valueFromLookup就是这样一种“上下文方法”。 这是一个比较两种方法的合成时间值的示例:
const paramName = '/cdk-bootstrap/hnb659fds/version';
const fromName: ssm.IStringParameter = ssm.StringParameter.fromStringParameterName(this, 'FromName', paramName);
const fromLookup: string = ssm.StringParameter.valueFromLookup(this, paramName);
console.dir({ fromName: fromName.stringValue, fromLookup });
// -> { fromName: '${Token[TOKEN.196]}', fromLookup: '12' }
valueFromLookup
通过 SDK 调用获取一次值并将其缓存在cdk.context.json
中。 CDK 建议您提交此文件以遵守确定性部署最佳实践。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.