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

Posted

技术标签:

【中文标题】如何从 Cloud Formation 获取 Elastic Container Repository URI?【英文标题】:How to get Elastic Container Repository URI from Cloud Formation? 【发布时间】:2018-02-02 02:59:26 【问题描述】:

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

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

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

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

docker-repo.company.com

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

我错过了什么吗?谢谢!

【问题讨论】:

也许只运行registry?他们很漂亮simple to setup 是的,但是如果我们还是打算使用 ECS 又有什么意义呢?通过这种方式 AWS 为我们管理它,我们最大限度地减少了我们必须自己管理的服务数量。 是的,只有在 ECR 特定设置之外的要求对您来说是值得的。 【参考方案1】:

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

有no attribute for the URI,尽管有趣的是他们的Ruby SDK does support it,甚至还有third-party, cross-cloud Terraform supports it。

但是,您可以解决这个问题,因为存储库 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"

【讨论】:

你知道更令人失望的是什么吗?必须在 AWS 上使用全球分布式基础设施 (Cloud Front) 进行任何涉及自定义域名和 HTTPS 的设置。除非我错过了什么 :( 我这样说是因为 S3 设置最终无法满足我们的要求,我不得不求助于 Cloud Front。【参考方案2】:
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"

(添加为单独的答案,因为我缺乏声誉点来评论先前的答案)

【讨论】:

如果您同意,我将编辑我的答案以包含您的改进版本。 当然,没问题。谢谢! 谢谢你,@sgeb!

以上是关于如何从 Cloud Formation 获取 Elastic Container Repository URI?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloud Formation 模板自动扩展 DynamoDB?

如何在 AWS Cloud Formation 中实施嵌套堆栈?

如何在 Cloud Formation 模板中使列表项有条件?

如何在 Elastic Beanstalk Cloud Formation 脚本中强制 ELB 配置

如何使用 Cloud Formation 模板在 S3 存储桶上设置 SSE-S3 或 SSE-KMS 加密?

以下 AWS Cloud Formation 错误?