无服务器:堆栈中已存在Deplyment错误S3存储桶

时间:2019-11-28 10:09:07

标签: amazon-web-services amazon-s3 amazon-cloudformation serverless-framework serverless

我正在尝试部署一个无服务器项目,该项目在serverless.yml文件中具有s3存储桶创建cloudformation,但是问题是当我尝试进行部署时,它说s3存储桶已经存在并且部署失败。

我知道s3存储桶名称应该是全局唯一的,而且我肯定该名称是我正在使用的唯一名称,即使更改为其他名称,它仍然表示相同。

它说s3存储桶存在的cloudformation堆栈实际上是新创建的堆栈,不确定如何解决此问题。谁能帮助我解决这个问题,并告诉我如何解决部署问题以及问题的原因:)。

谢谢。

4 个答案:

答案 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凭证,权限或区域的问题,这些问题会产生误导性错误消息。要解决这些问题,或至少排除它们:

  1. 确保将serveless.yml设置为已在其中部署堆栈的区域。示例:
custom:
  stage: dev
  region: us-east-2
  1. 通过在将用于部署的shell中显式设置凭据,覆盖例如~/.aws/credentials中的任何潜在凭据。 Serverless docs中的示例:
export AWS_ACCESS_KEY_ID=<your access key here>
export AWS_SECRET_ACCESS_KEY=<your access secret here.
  1. 确保这些AWS凭证具有the roles and permissions they need

但是,正如我所提到的,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