无服务器-AWS S3存储桶已经存在

问题描述

我正在构建我的第一个sls应用程序,并且试图创建两个存储桶。 “ logosBucket”可完美运行。我执行了相同的过程来创建另一个名为“ DocumentsBucket”的文件,但失败并显示以下消息:“发生错误:DocumentsBucket -documents-bucket-dev已经存在。”

我看过堆栈,它没有在资源下列出。我知道有桶事件发生的问题,但我不认为这是我的情况。感觉像是一个非常简单的疏忽,但我有点迷茫。

这是我的serverless.yml文件

    iamRoleStatements:
    - ${file(iam/logosBucketIAM.yml):logosBucketIAM}
    - ${file(iam/DocumentsBucketIAM.yml):DocumentsBucketIAM}

resources:
  Resources:
    logosBucket: ${file(resources/logosBucket.yml):logosBucket}
    logosBucketPolicy: ${file(resources/logosBucket.yml):logosBucketPolicy}
    DocumentsBucket: ${file(resources/DocumentsBucket.yml):DocumentsBucket}
    DocumentsBucketPolicy: ${file(resources/DocumentsBucket.yml):DocumentsBucketPolicy}

...

custom:
  logosBucket:
    name: logos-bucket-${self:provider.stage}
  DocumentsBucket:
    name: documents-bucket-${self:provider.stage}

DocumentsBucketIAM.yml:

DocumentsBucketIAM:
  Effect: Allow
  Action:
    - s3:PutObject
  Resource: arn:aws:s3:::${self:custom.DocumentsBucket.name}/*

logosBucketIAM.yml:

logosBucketIAM:
  Effect: Allow
  Action:
    - s3:PutObject
  Resource: arn:aws:s3:::${self:custom.logosBucket.name}/*

DocumentsBucket.yml:

DocumentsBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: ${self:custom.DocumentsBucket.name}

DocumentsBucketPolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    Bucket: !Ref DocumentsBucket
    PolicyDocument:
      Statement:
        - Sid: PublicRead
          Effect: Allow
          Principal: '*'
          Action:
            - s3:Getobject
          Resource: arn:aws:s3:::${self:custom.DocumentsBucket.name}/*

logosBucket.yml:

logosBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: ${self:custom.logosBucket.name}

logosBucketPolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    Bucket: !Ref logosBucket
    PolicyDocument:
      Statement:
        - Sid: PublicRead
          Effect: Allow
          Principal: '*'
          Action:
            - s3:Getobject
          Resource: arn:aws:s3:::${self:custom.logosBucket.name}/*

我将感谢您调试sls的任何帮助和/或技巧。谢谢!

解决方法

S3是通用名称空间,这意味着您创建的每个S3存储桶必须具有唯一的名称,该名称不会被世界上其他任何人使用。这是因为您的存储桶名称构成了S3网址的一部分,该网址必须唯一。