我正在尝试使用无服务器框架部署 lambda 函数 (lambda-1),该框架应该有 s3 创建事件作为触发器。除了要部署的 lambda 函数之外,还有另一个名称不同的 lambda 函数 (lambda-2),它们彼此无关。而且还带有 s3 触发器。两种功能都使用不同的存储桶。每次我尝试部署 lambda-1 时,都会显示以下内容:
CREATE_FAILED: CustomDashresourceDashexistingDashs3LambdaFunction (AWS::Lambda::Function)
<prefix-of-both-lambdas>-custom-resource-existing-s3 already exists in stack arn:aws:cloudformation:eu-central-1:xxx:stack/<prefix-lambda-2>-<lambda-2-name>/xxxsome-uuidxxxx
View the full error: https://eu-central-1.console.aws.amazon.com/cloudformation/home?region=eu-central-1#/stack/detail?stackId=arn%3Aaws%3Acloudformation%3Aeu-central-1%......
1 deprecation found: run 'serverless doctor' for more details
lambda-1 的配置:
functions:
lambda-1:
handler: src/lambda_handler.main
environment:
ENV: ${opt:stage}
events:
- s3:
bucket: ${ssm:/panda/${opt:stage}/strings/lambda-1-bucket}
event: s3:ObjectCreated:*
rules:
- prefix: <s3-prefix>/
- suffix: .csv
existing: true
forceDeploy: true
resources:
Outputs:
ServerlessDeploymentBucketName:
Export:
Name: "${self:service}-${opt:stage}-${self:custom.serverless-aws-resource-names.variables.lambdaFunctionName}-sls-dpl"
PythonRequirementsLambdaLayerHash:
Export:
Name: "${self:service}-${opt:stage}-${self:custom.serverless-aws-resource-names.variables.lambdaFunctionName}-requirements-LayerHash"
PythonRequirementsLambdaLayerQualifiedArn:
Export:
Name: "${self:service}-${opt:stage}-${self:custom.serverless-aws-resource-names.variables.lambdaFunctionName}-requirements-LayerQualifiedArn"
PythonRequirementsLambdaLayerS3Key:
Export:
Name: "${self:service}-${opt:stage}-${self:custom.serverless-aws-resource-names.variables.lambdaFunctionName}-requirements-LayerS3Key"
lambda-2 的配置:
functions:
lambda-2:
package:
artifact: ${env:MVN_ARTIFACT_RELATIVE_PATH}
handler: lambda_handler.Handler
events:
- s3:
bucket: ${ssm:/panda/${opt:stage}/strings/lambda-2-bucket}
event: s3:ObjectCreated:*
rules:
- suffix: .xlsx
existing: true
logSubscription: true
memorySize: 512
timeout: 120
resources:
Outputs:
ServerlessDeploymentBucketName:
Export:
Name: "sls-${self:service}-${opt:stage}-${self:custom.serverless-aws-resource-names.variables.lambdaFunctionName}-ServerlessDeploymentBucketName"
当我删除两个 CloudFormation 堆栈时,可以部署其中一个 lambda,但另一个将失败。另外,我没有在 serverless.yml 中定义此资源,两个 s3-trigger-bucket 的命名不同于:
<prefix-of-both-lambdas>-custom-resource-existing-s3
从 CloudFormation 错误来看,您的帐户上似乎存在一个预先存在(或曾经存在)的堆栈,该堆栈在某个时刻使用相同的 Lambda 名称启动。
解决此问题的最简单方法是完全删除有问题的资源,在本例中是导致冲突的 S3 存储桶,然后重新部署。
尽管存在冲突,但部署
lambda-2
失败的原因是CloudFormation堆栈需要所有资源都能够正常运行,否则它将启动回滚过程来反转操作。