引用 CF 模板中的现有资源

引用 CF 模板中的现有资源

我们有多个 CloudFormation 脚本来创建我们的堆栈。

现在,我们想编写(自动化)新脚本,仅用于更新1特定资源(业务需求)。

我所困惑的是如何参考引用更新脚本中的现有资源?我知道有REF函数,但我相信它只是用于引用同一脚本中的资源。AWS 是否提供了引用现有资源的功能?

我已阅读我们可以使用parameters但还有其他选择吗?

答案1

我最近必须对一些引用共享服务的分层部署执行此操作。除了参数之外,这里还有一些其他选项:

  1. 命名导出:如果您有一些由单独的 CloudFormation 堆栈创建的资源并且只想引用它们(例如,基础设施管理员设置了较低级别的部分供应用程序团队在其上部署),那么这是一个不错的选择。

  2. 代换:在许多情况下,您可能只需要引用一个众所周知的名称,该名称是恒定的,但 ARN 会根据 AWS 账户 ID 而变化。您可以使用Fn::Sub它来扩展一些“伪参数”例如账户ID或者地区:

    "TaskRoleArn": { "Fn::Sub": "arn:aws:iam::${AWS::AccountId}:role/YourSharedServiceTaskRole" }

  3. SSM 参数:您可以拥有一个动态引用来检索 SSM 属性。这对于完全从该值的来源中抽象出来非常方便——它可以由 CloudFormation 创建,但实际上也可能是某人运行一次性命令行脚本,并且它支持密码和其他机密的安全存储,可以配置为防止除目标服务(例如 EC2 / ECS IAM 实例角色)以外的任何人检索——例如,我使用它来存储 SES 凭据:

    aws ssm put-parameter --type String --name "/project/mail/EmailHost" --value email-smtp.us-east-1.amazonaws.com aws ssm put-parameter --type String --name "/project/mail/EmailUser" --value <SES_ACCESS_KEY> aws ssm put-parameter --type SecureString --key-id alias/your-well-known-iam-kms-alias --name "/project/mail/EmailPassword" --value <SES PASSWORD>`

  4. :这是最近宣布的,是一种非常强大的机制,您可以使用 Lambda 函数返回任意 JSON 以包含在模板中。这几乎可以做任何事情,从调配 CloudFormation 堆栈创建者没有直接权限创建的额外资源,到在数据库中查找值并返回配置了模板,例如,从父组织管理的更大预留池中分配 VPC CIDR。

答案2

如果您知道资源的名称,则可以通过变量和名称构建资源 ARN,如下所示:

Queue: !Sub arn:aws:sqs:${AWS::Region}:${AWS::AccountId}:alarms-queue-${Environment}

答案3

AWS 使用 ARN(AWS 资源名称)来引用资源。以下是常规格式:

arn:分区:服务:区域:账户 ID:资源 arn:分区:服务:区域:账户 ID:资源类型/资源 arn:分区:服务:区域:账户 ID:资源类型:资源

你可以查找更多信息http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html

您还可以在服务文档页面中查找要引用的资源所使用的特定 ARN

答案4

亚马逊 CDK(撰写本文时目前处于开发人员预览阶段)提供了一种导入现有资源的方法:

如果您需要引用在 CDK 应用程序之外定义的资源(例如 Amazon S3 存储桶或 VPC),则可以使用 AWS 构造中提供的 Xxxx.import(...) 静态方法。例如,您可以使用 Bucket.import() 方法获取 BucketRef 对象,该对象可用于大多数需要存储桶的地方。此模式允许将应用程序之外定义的资源视为应用程序的一部分。

来源:https://docs.aws.amazon.com/CDK/latest/userguide/aws_construct_lib.html

它还允许导入现有的 CloudFormation 模板: https://docs.aws.amazon.com/CDK/latest/userguide/use_cfn_template.html

我希望这有帮助。

相关内容