无服务器:部署错误 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 存储桶已存在于堆栈中的主要内容,如果未能解决你的问题,请参考以下文章
使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知