gpt4 book ai didi

amazon-web-services - 在 Cloud Formation 中创建然后更改资源

转载 作者:行者123 更新时间:2023-12-03 07:30:57 24 4
gpt4 key购买 nike

首先,我对 Cloud Formation 非常陌生。我正在尝试构建一个模板,该模板将部署一个相当简单的环境,其中包含两个服务。

我需要一个 S3 存储桶,每当创建对象时都会触发一条消息发送到 SQS。创建这些 Assets 时,S3 配置必须包含指向 SQS 队列的指针。但是SQS队列必须有一个专门允许S3存储桶权限的策略。这会产生循环依赖。为了打破这个循环,我想做以下事情:

  1. 创建 S3 存储桶
  2. 创建SQS队列,引用S3存储桶
  3. 修改 S3 存储桶以引用 SQS 队列。

当我尝试此操作时,我收到一条错误消息,告诉我找不到 SQS 队列。当我将 DependsOn 命令放入 #3 时,它会在循环依赖中出错。

您可以声明一个资源,并稍后在模板中使用新参数重新声明它吗?如果是这样,你会怎么做。我这样做是错误的吗?

最佳答案

在这种情况下导致循环依赖的原因是使用内部函数,例如 RefFn::GetAtt ,这需要引用资源可用。为了避免这种情况,您可以指定资源 ARN,而不引用资源。以下是一个示例模板,其中 CloudFormation 执行以下操作:

  1. 创建队列
  2. 添加队列策略以向不存在的存储桶授予权限
  3. 创建存储桶

模板:

Parameters:
BucketName:
Description: S3 Bucket name
Type: String
Default: mynewshinybucket

Resources:
Queue:
Type: AWS::SQS::Queue

QueuePolicy:
Type: AWS::SQS::QueuePolicy
Properties:
Queues:
- !Ref Queue
PolicyDocument:
Statement:
- Effect: Allow
Action: SQS:SendMessage
Resource: !GetAtt Queue.Arn
Principal:
AWS: '*'
Condition:
ArnLike:
# Specify bucket ARN by referring to a parameter instead of the actual bucket resource which does not yet exist
aws:SourceArn: !Sub arn:aws:s3:::${BucketName}

Bucket:
Type: AWS::S3::Bucket
# Create the bucket after the queue policy to avoid "Unable to validate the following destination configurations" errors
DependsOn: QueuePolicy
Properties:
BucketName: !Ref BucketName
NotificationConfiguration:
QueueConfigurations:
- Event: 's3:ObjectCreated:Put'
Queue: !GetAtt Queue.Arn

编辑:当使用 Ref/GetAtt/Sub 从另一个资源检索值时,它们都要求该资源可用。CloudFormation 将确保使用该函数的资源始终在引用资源之后创建。通过这种方式可以检测到循环依赖。Sub 用于字符串替换,但与参数或资源一起使用时与 Ref 完全相同 (Source) .

重点是我们指的是一个始终可用的参数(而不是资源)。在这种情况下,使用 Sub 会更简单一些,因为使用 Ref 需要额外的 Join 。例如,这会给你相同的结果:

            aws:SourceArn: !Join
- ''
- - 'arn:aws:s3:::'
- !Ref BucketName

另一种方法是在不使用任何内部函数的情况下对存储桶 ARN 进行硬编码。重要的是不要引用存储桶本身,以避免循环依赖。

关于amazon-web-services - 在 Cloud Formation 中创建然后更改资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65431541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com