我们有多个 CloudFormation 脚本来创建我们的堆栈。
现在,我们想编写(自动化)新脚本,仅用于更新1特定资源(业务需求)。
我所困惑的是如何参考引用更新脚本中的现有资源?我知道有REF
函数,但我相信它只是用于引用同一脚本中的资源。AWS 是否提供了引用现有资源的功能?
我已阅读我们可以使用parameters
但还有其他选择吗?
答案1
我最近必须对一些引用共享服务的分层部署执行此操作。除了参数之外,这里还有一些其他选项:
命名导出:如果您有一些由单独的 CloudFormation 堆栈创建的资源并且只想引用它们(例如,基础设施管理员设置了较低级别的部分供应用程序团队在其上部署),那么这是一个不错的选择。
代换:在许多情况下,您可能只需要引用一个众所周知的名称,该名称是恒定的,但 ARN 会根据 AWS 账户 ID 而变化。您可以使用
Fn::Sub
它来扩展一些“伪参数”例如账户ID或者地区:"TaskRoleArn": { "Fn::Sub": "arn:aws:iam::${AWS::AccountId}:role/YourSharedServiceTaskRole" }
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>`
宏:这是最近宣布的,是一种非常强大的机制,您可以使用 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
我希望这有帮助。