无服务器: 部署错误 S3 Bucket已经存在于堆栈中

18
我正在尝试部署一个无服务器项目,其中在serverless.yml文件中有s3存储桶创建的cloudformation配置,但问题在于当我尝试部署时,它说这个s3存储桶已经存在并且部署失败。
我知道s3存储桶名称应该是全局唯一的,而我非常确定我正在使用一个独特的名称,即使更改为其他名称,它仍然会显示相同的错误信息。
它所说的cloudformation堆栈实际上是新创建的堆栈,不确定如何解决此问题。请问是否有人可以帮助我解决这个问题,并告诉我如何修复部署问题以及问题的原因:)。
提前致谢。

我遇到了同样的问题 - 在我的情况下,似乎与引用S3存储桶的事件有关,因为当我只有创建存储桶而没有事件时,错误不会发生。 - Spencer
1
你能分享一下模板吗? - Amit Baranes
1
你能分享一下你的 serverless.yml 文件吗? - dege
1
如果S3 Bucket没有唯一的名称,您也会收到错误信息,更多信息请参见:https://repost.aws/knowledge-center/s3-error-bucket-already-exists - Keivan
6个回答

12
我遇到的问题是,对于其中一个lambda,我将上述提到的bucket作为“事件源”event source,因此当添加某些bucket作为事件源时,实际上也会创建该bucket,因此在运行与创建相关的cloudformation时,它会说该bucket已经存在。
因此,我通过仅保留事件源并删除该bucket的实际声明来解决了这个问题。

1
经过1小时的思考,我得出了同样的结论。这是一个非常讨厌的小问题。 - ChrisRich
1
我花了一整天的时间寻找它。在我看来,这更像是一个bug,框架应该发出警告或抛出错误。非常感谢! - Carlos Alberto Schneider

7
如果您在serverless.yml 文件中的S3配置中添加 existing: true,则它不会像下面这样尝试创建S3存储桶:
funcName:
    handler: handler
    events:
        -   s3:
                bucket: 'my-bucket-name'
                events: s3:ObjectCreated:*
                existing: true
                rules:
                    -   suffix: .pdf
                    -   prefix: documents

我尝试了!它不起作用。 - Henry Bui
该属性不存在。 - Jorge Freitas
对我来说,frameworkVersion: '3' 运行得很好。 - undefined

5

任何涉及CloudFormation(或任何其他基础设施即代码)的内容都是棘手的,错误消息可能会误导,这意味着有很多事情可以导致此问题(请参见GitHub上的问题,例如此问题)。

但根据我的经验,这种问题最常见的原因不是现有的存储桶,而是AWS凭证、权限或区域存在问题,导致了误导性的错误消息。为解决这些问题,或至少排除它们,请执行以下操作:

  1. 确保您的serveless.yml已设置为您已在其中部署堆栈的区域。例如:
custom:
  stage: dev
  region: us-east-2
  1. 通过在您将用于部署的 shell 中显式设置凭据,覆盖来自例如 ~/.aws/credentials 的任何潜在凭据。以下是来自Serverless 文档的示例:
export AWS_ACCESS_KEY_ID=<your access key here>
export AWS_SECRET_ACCESS_KEY=<your access secret here.
  1. 确保这些AWS凭据拥有它们所需的角色和权限

但正如我所提到的,CloudFormation很挑剔。可能还有其他问题需要解决,但请先尝试这些解决方法。你可以尝试它们,但仍然可能会遇到困难,但这将更有可能是正确的方向。希望这些能帮到你。


这个答案对我非常有帮助。在我的情况下,我的配置文件地区设置与我尝试部署到的地区不同。确实是一个非常具有误导性的错误消息。 - Paul
基础设施即代码真是让人头疼! - Matthew

1
尝试使用条件语句并将它们作为参数传递来创建存储桶或不创建。
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Description: Environment type.
    Default: test
    Type: String
    AllowedValues:
      - prod
      - test
    ConstraintDescription: must specify prod or test.
Conditions:
  CreateProdResources: !Equals 
    - !Ref EnvType
    - prod
Resources:
  EC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: ami-0ff8a91507f77f867
  MountPoint:
    Type: 'AWS::EC2::VolumeAttachment'
    Condition: CreateProdResources
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: 'AWS::EC2::Volume'
    Condition: CreateProdResources
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt 
        - EC2Instance
        - AvailabilityZone

按照示例条件流程来决定是否创建资源。 点击此处查看更多细节

0

在部署时,BucketName 必须在所有区域中是唯一的。因此,如果有人已经创建了一个名为“local-bucket-dev”的桶,它将会抛出异常。

 An error occurred: AttachmentsBucket - local-bucket-dev already 
 exists.

尝试使BucketName唯一。

希望这有所帮助。


-1

请确保您为存储桶选择的名称不是 AWS 中的保留名称。我曾经遇到过与 BucketName: 'analytics-s3-bucket' 相同的问题,更改了名称后一切正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接