我正在尝试部署一个无服务器项目,该项目在serverless.yml文件中具有s3存储桶创建cloudformation,但是问题是当我尝试进行部署时,它说s3存储桶已经存在并且部署失败。
我知道s3存储桶名称应该是全局唯一的,而且我肯定该名称是我正在使用的唯一名称,即使更改为其他名称,它仍然表示相同。
它说s3存储桶存在的cloudformation堆栈实际上是新创建的堆栈,不确定如何解决此问题。谁能帮助我解决这个问题,并告诉我如何解决部署问题以及问题的原因:)。
谢谢。
答案 0 :(得分:2)
我遇到的问题是,对于其中一个lambda,我将上述存储桶称为event source
,因此,当添加一些存储桶作为事件源时,它实际上也创建了该存储桶,因此当它运行与创建相关的实际Cloudformation时,就表示该存储桶已经存在。
因此,我只保留了事件源,并删除了该存储桶的实际声明。
答案 1 :(得分:1)
如果您将 existing: true
添加到 serverless.yml
文件中的 S3 配置中,它不会尝试创建如下所示的 S3 存储桶:-
funcName:
handler: handler
events:
- s3:
bucket: 'my-bucket-name'
events: s3:ObjectCreated:*
existing: true
rules:
- suffix: .pdf
- prefix: documents
答案 2 :(得分:0)
任何涉及CloudFormation(或任何其他代码中基础架构)的事情都是挑剔的,并且错误消息可能会误导他人,这意味着有很多事情可能导致此问题(请参阅GitHub上的问题,例如this one)
但是,根据我的经验,这类问题的最常见原因不是预先存在的存储桶,而是AWS凭证,权限或区域的问题,这些问题会产生误导性错误消息。要解决这些问题,或至少排除它们:
serveless.yml
设置为已在其中部署堆栈的区域。示例:custom:
stage: dev
region: us-east-2
~/.aws/credentials
中的任何潜在凭据。 Serverless docs中的示例:export AWS_ACCESS_KEY_ID=<your access key here>
export AWS_SECRET_ACCESS_KEY=<your access secret here.
但是,正如我所提到的,CloudFormation非常挑剔。可能还有其他问题需要解决,但是请首先尝试。您可以尝试使用它们,但仍会在墙上碰头,但这很可能是 right 墙。希望这会有所帮助。
答案 3 :(得分:0)
我遇到了这个问题,我的解决方案是更改存储桶名称
之前:
resources:
Resources:
S3Assets:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:service}-${opt:stage}
之后:
resources:
Resources:
S3Assets:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:service}-${opt:stage}-bucket