在无服务器阶段之间重用相同的 s3 存储桶

Reuse the same s3 bucket between stages serverless

我们的客户已经在我们的开发环境中注册,管理层要求我们在不丢失任何已注册用户数据的情况下创建生产环境。

我们正在尝试在 ap-southeast-2 上部署生产环境,而我们的开发环境已经在 eu-west-1[=26= 上].

我已经为在这两个区域进行部署进行了必要的更改,但问题是我们正在使用 cloudformation 模板创建 cognito 和 s3 存储桶。

我们想在这两个区域之间使用相同的 s3 存储桶和 cognito,但问题是当我部署到 ap-southeast-2(生产)时,堆栈创建失败,因为 s3 存储桶已经存在。

是否可以在区域和阶段之间重复使用相同的 s3 存储桶和 cognito?我希望无服务器框架检查这些资源是否存在于我选择的区域(在本例中为 eu-west-1)。我们无法创建新的存储桶,因为我们已达到 100 个存储桶的限制!

这是我们如何创建 s3 存储桶的代码。我们正在使用带有 nodejs 的无服务器框架。

Resources:
  AttachmentsBucket:
    Type: AWS::S3::Bucket
    Properties:
      # Set the CORS policy
      CorsConfiguration:
        CorsRules:
          -
            AllowedOrigins:
              - '*'
            AllowedHeaders:
              - '*'
            AllowedMethods:
              - GET
              - PUT
              - POST
              - DELETE
              - HEAD
            MaxAge: 3000

# Print out the name of the bucket that is created
Outputs:
  AttachmentsBucketName:
    Value:
      Ref: AttachmentsBucket

I want the serverless framework to check if these resources exists at the region I choose

这不是基础架构即代码 (IaC) 的工作方式。 CloudFormation 和 terraform 都没有任何内置工具来“检查”资源是否存在。 IaC 的观点是——如果它在模板中,那么只有给定的 template/stack 才能管理它。中间没有任何东西,可能存在也可能不存在。

话虽如此,还是有很多方法可以重新架构并解决这个问题。最常见的方式是:

  1. 由于存储桶是公共资源,它应该与您的其他堆栈分开部署,并且它的名称应该作为输入传递给相关堆栈。

  2. 开发一个lambda函数形式的custom resource。该函数将使用 AWS SDK 检查您的存储桶是否存在,并将该信息 return 发送到您的堆栈以供进一步使用。