繁体   English   中英

AWS CDK - DockerImageAsset - 如何在下游映像中使用已发布的 ECR 映像?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM