我正在尝试从 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。
我错过了什么吗?谢谢!
这有点愚蠢,但最终你似乎无法引用 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}"
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}"
(添加为单独的答案,因为我缺乏声誉点来评论之前的答案)
GetAtt
函数获取存储库 URI。此功能于 2021 年添加(或至少记录)(根据互联网档案馆,在2021-05-06和2021-09-24之间)。请参阅此处当前文档。 在 YAML 中:
HostName: !GetAtt MyRepository.RepositoryUri
假设 ECR 存储库的逻辑名称是 MyRepository
。JSON 格式:
"HostName": {
"Fn::GetAtt": ["MyRepository", "RepositoryUri"]
}
MyFunction:
Type: AWS::Lambda::Function
Properties:
PackageType: Image
Code:
ImageUri: !Sub "${MyRepository.RepositoryUri}:tag"