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

Posted

技术标签:

【中文标题】无服务器:部署错误 S3 存储桶已存在于堆栈中【英文标题】:Serverless: Deplyment error S3 Bucket already exists in stack 【发布时间】:2020-03-23 23:03:14 【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

我遇到了同样的问题 - 在我的情况下,它似乎与引用 S3 存储桶的事件有关,就像我刚刚创建存储桶但没有发生错误的事件一样. 可以分享一下模板吗? 你能分享一下你的 serverless.yml 怎么样? 【参考方案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】:

我遇到的问题是,对于其中一个 lambda,我将上述存储桶作为 event source,因此当添加一些存储桶作为事件源时它实际上也创建了该存储桶 ,因此当它运行实际创建相关的 cloudformation 时,它表示存储桶已经存在。

所以我只保留事件源并删除了该存储桶的实际声明来修复它。

【讨论】:

【参考方案3】:

涉及 CloudFormation(或任何其他代码中的基础架构)的任何事情都很麻烦,并且错误消息可能会产生误导,这意味着有很多事情会导致此问题(请参阅 GitHub 上的问题,例如 this one)。

但根据我的经验,这类问题的最常见原因是不是预先存在的存储桶,而是 AWS 凭证、权限或区域的问题,这些问题会提供误导性错误消息。要解决这些问题,或者至少排除它们:

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

但是,正如我所提到的,CloudFormation 很挑剔。可能还有其他问题需要解决,但请先尝试这些。您可能会尝试它们,但仍然会用头撞墙,但它更有可能是正确的墙。希望这会有所帮助。

【讨论】:

这个答案对我很有帮助。就我而言,我的个人资料区域设置为与我尝试部署的区域不同的区域。确实非常具有误导性的错误消息。

以上是关于无服务器:部署错误 S3 存储桶已存在于堆栈中的主要内容,如果未能解决你的问题,请参考以下文章

如何为“无服务器”部署创建一个 s3 存储桶?

S3 错误:使用嵌套堆栈部署 CFN 模板时访问被拒绝

使用 S3 存储桶为资产提供服务的无服务器

使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知

无服务器框架:使用来自资源的存储桶的 S3 Lambda 触发器

表中无访问时的存储过程访问