【发布时间】:2021-12-23 06:57:43
【问题描述】:
我正在尝试为我的服务编写serverless 配置。要求是 S3 存储桶在对象创建事件上向 SQS 队列发送通知。但是,当我尝试使用 serverless deploy 部署我的服务时,我收到此错误:
Serverless Error ----------------------------------------
An error occurred: PolicyS3Bucket - Unable to validate the following destination configurations (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; Request ID: 4D25CQFZN0R2Q9FG; S3 Extended Request ID: dLfKHJgOnDUcAF3xwN9EgW9LibP3bt7ITj7PyuCXs2qH6Qvmn2iZu7aXYbbUdqptPvgvjwkcWYM=; Proxy: null).
我发现this page(如果我理解正确的话)解释说我的 S3 存储桶和我的 SQS 队列之间存在循环依赖关系,并且我必须修复这种循环依赖关系才能成功部署我的服务。
此页面说明我可以使用Fn::Sub 或Fn::Join 来修复循环依赖。根据这个建议,我将我的配置从原始版本修改为新版本,如下所示,使用Sub:
cfn.s3.yml(原版)
Resources:
PolicyS3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:custom.config.policyBucketName}
AccessControl: Private
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
NotificationConfiguration:
QueueConfigurations:
- Event: s3:ObjectCreated:*
Queue: !GetAtt SQSQueue.Arn
BucketEncryption:
ServerSideEncryptionConfiguration:
- BucketKeyEnabled: true
ServerSideEncryptionByDefault:
KMSMasterKeyID: !Ref CustomMasterKey
SSEAlgorithm: aws:kms
Tags: ${redacted}
cfn.s3.yml(新版本,更改为粗体)
我不变的cfn.sqs.yml
Resources:
SQSQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: ${self:custom.config.sqsQueueName}
当我尝试使用新版本 serverless deploy 时,我得到了同样的错误。
我也尝试了@kgiannakakis 的建议来使用DependsOn,但是当我尝试这样做时,我得到了同样的错误。
如何修复无服务器配置,以便成功部署服务?
【问题讨论】:
-
您需要 SQS ARN 中的区域和账户 ID:docs.aws.amazon.com/general/latest/gr/…
-
我修复了 ARN,请参阅更新后的问题。
-
尝试使用 DependsOn 属性 (docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…),以便首先创建队列。我仍然不清楚,为什么桶和队列之间存在循环依赖关系。
-
我不确定自己是否存在循环依赖。我刚刚搜索了“无法验证以下目标配置”,这将我带到了我在问题中链接的 AWS 文档页面,这表明该错误意味着循环依赖。我是 CloudFormation 和无服务器的新手,所以我只是假设只有在存在循环依赖时才会发生错误,但这可能是一个错误的假设。
-
@kgiannakakis 我试过
DependsOn,但我仍然遇到同样的错误。
标签: amazon-web-services amazon-s3 amazon-cloudformation amazon-sqs serverless-framework