【问题标题】:Create AWS cache clusters in VPC with CloudFormation使用 CloudFormation 在 VPC 中创建 AWS 缓存集群
【发布时间】:2013-03-21 18:36:38
【问题描述】:

我正在使用 CloudFormation 在 VPC 内创建一个 AWS 堆栈,并且需要在其上创建 ElastiCache 集群。我调查过,CloudFormation 不支持在 VPC 中创建缓存集群。 我们的“解决方法”是在某些“固定”实例(例如堡垒)使用 CloudInit 和 AWS AmazonElastiCacheCli 工具(elasticache-create-cache-subnet-group、elasticache-create-cache-cluster)引导时创建缓存集群.然后,当前端机器引导时(我们使用自动缩放),它们使用 elasticache-describe-cache-clusters 来获取缓存集群节点并更新配置。

我想知道您对此问题是否有不同的解决方案。

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-elasticache amazon-vpc


    【解决方案1】:

    现已在 Cloudformation 模板中为 Elasticache 添加了 VPC 支持。

    要在您的 VPC 中启动 AWS::ElastiCache::CacheCluster,请创建一个 AWS::ElastiCache::SubnetGroup,以定义您希望 Elasticache 在您的 VPC 中的哪个子网,并将其分配给 AWS::ElastiCache::CacheClusterCacheSubnetGroupName 属性。

    【讨论】:

    • 谢谢,在我花了 2 小时弄清楚为什么 VpcSecurityGroupIds 不足以让 CacheCluster 在我的 VPC 中运行之后,这让我免于绝望。
    【解决方案2】:

    您的解决方法是一个合理的解决方法(并且表明您似乎已经控制了您的 AWS 操作)。

    您最终可以通过专用的 CustomResource 类型改进您的自定义解决方案,这是 特殊的 AWS CloudFormation 资源,为模板开发人员提供了一种将资源包含在 AWS CloudFormation 堆栈中的方法,这些资源由Amazon Web Services 以外的来源。 - AWS CloudFormation Custom Resource Walkthrough 很好地概述了这一切的含义、它的工作原理以及实现您自己的需要什么。

    将此外观用于自定义资源(即在您的情况下为 Amazon ElastiCache 集群)的好处是它的整个生命周期(创建/更新/删除)可以像任何官方支持的方式一样以类似和受控的方式处理CloudFormation 资源类型,例如资源创建失败将从整个堆栈的角度透明地处理。

    但是,对于手头的用例,您实际上可能只想等待获得官方支持:

    • AWS 在最近的主要 Amazon EC2 Update - Virtual Private Clouds for Everyone! 中宣布了对 ElastiCache 的 VPC 支持,这归结为(几乎)每个人的默认 VPC

      我们希望每个 EC2 用户都能从我上面概述的 Amazon VPC 的高级网络和其他功能中受益。为了实现这一点,即将开始,新 AWS 客户(以及在新区域中启动的现有客户)的实例将在“EC2-VPC”平台中启动。 [...]

      您无需事先创建 VPC - 只需启动 EC2 实例或配置 Elastic Load Balancer、RDS 数据库,或 ElastiCache 集群就像您在 EC2-Classic 中一样,我们将创建一个 为您免费提供 VPC。我们会将您的资源投入其中 VPC [...] [强调我的]

    • 此更新有点暗示任何新服务都可能会立即在 VPC 中提供(否则新的 EC2-VPC 平台将不会像预想的那样自动为新客户工作)。
    因此,我希望 CloudFormation 团队也能效仿并完成/修改他们对部署到 VPC 的支持。

    【讨论】:

    • 正如你所说,我仍然需要解决删除堆栈时如何删除缓存集群。这可能是使用 CustomResource 的原因。会看看。
    • 自定义资源对我来说很好用。比 CloudFormation 通知要好得多。
    【解决方案3】:

    对此我的解决方案是有一个控制器进程来轮询消息队列,该消息队列订阅了我通知 CloudFormation 事件的 SNS 主题(当您创建 CloudFormation 堆栈以将通知发送到SNS 主题)。

    我将所需的参数作为标签传递给 AWS::EC2::Subnet 并让控制器在创建子网时提取它们。我在创建 AWS::CloudFormation::WaitConditionHandle 时执行设置,并使用 PhysicalResourceId 通过 PUT 卷曲以满足 AWS::CloudFormation::WaitCondition。

    它有点工作,但不处理 ElastiCache 中的资源删除,因为没有用于堆栈删除的 AWS::CloudFormation::WaitCondition 类似物。这是我的方法的手动操作过程。

    CustomResource 方法看起来更精致,但需要一个端点,而我没有。如果您可以将端点放在一起,那看起来就是要走的路。

    【讨论】:

    • 进一步了解 CustomResource 方法,我现在意识到您将 SNS 作为端点。使用这种方法比观察云形成事件要干净得多。无需 hacky 标签,您可以根据需要传递键值。我的解决方案很糟糕!
    猜你喜欢
    • 2020-12-15
    • 2017-11-02
    • 2012-04-23
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多