如何从 Cloud Formation 获取 Elastic Container Repository URI?

问题描述 投票:0回答:3

我正在尝试从 Cloud Formation 创建弹性容器服务 (ECS) 设置。

但是我不希望 ECS 存储库具有丑陋的自动生成的 URI:

111111111.dkr.ecr.us-east-1.amazonaws.com/docker-repo.company.com

但我希望它有一个美丽而闪亮的

docker-repo.company.com

存储库本身不允许设置 URI 或 甚至 CNAME。所以我尝试设置一个 S3 存储桶来重定向到存储库。但是,除非我遗漏了某些内容,否则 Cloud Formation 不支持此功能,因为使用 !Ref 或 !GetAtt 时,我无法在 AWS::ECR::Repository 对象中查询任何内容,从而为我提供存储库 URI。

我错过了什么吗?谢谢!

amazon-web-services docker amazon-s3 aws-cloudformation amazon-ecs
3个回答
30
投票

这有点愚蠢,但最终你似乎无法引用 ECR 的 URI,因为 Cloud Formation 不支持它。

没有 URI 属性,尽管有趣的是他们的 Ruby SDK 确实支持它,甚至第三方跨云 Terraform 也支持它

但是,您可以解决这个问题,因为存储库 URI 是稳定的,它不包含任何随机部分,因此您可以从已有的内容组成 URI:

HostName: !Sub "${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${dockerrepocompanycom}"
或者不太酷的老式版本:

HostName: !Join [ ".", [ !Ref "AWS::AccountId", "dkr.ecr", !Ref "AWS::Region", !Join [ "/", [ "amazonaws.com", !Ref "dockerrepocompanycom" ] ] ] ]
创建 S3 存储桶的完整工作配置:

s3dockerrepo1redirect: Type: AWS::S3::Bucket Properties: BucketName: "docker-repo.company.com" WebsiteConfiguration: RedirectAllRequestsTo: HostName: !Sub "${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${dockerrepocompanycom}"
    

4
投票
HostName: !Join [ ".", [ !Ref "AWS::AccountId", "dkr.ecr", !Ref "AWS::Region", !Join [ "/", [ "amazonaws.com", !Ref "dockerrepocompanycom" ] ] ] ]


更简洁的方式如下:

HostName: !Sub "${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${dockerrepocompanycom}"
(添加为单独的答案,因为我缺乏声誉点来评论之前的答案)


0
投票
现在可以使用 CloudFormation 中的

GetAtt

 函数获取存储库 URI。此功能于 2021 年添加(或至少记录)(根据互联网档案馆,在
2021-05-062021-09-24之间)。请参阅此处当前文档

在 YAML 中:

HostName: !GetAtt MyRepository.RepositoryUri
假设 ECR 存储库的逻辑名称是 

MyRepository

JSON 格式:

"HostName": { "Fn::GetAtt": ["MyRepository", "RepositoryUri"] }


顺便说一句,如果您使用图像类型 Lambda 函数的存储库,您可以像这样定义 Lambda 函数:

MyFunction: Type: AWS::Lambda::Function Properties: PackageType: Image Code: ImageUri: !Sub "${MyRepository.RepositoryUri}:tag"
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.