gpt4 book ai didi

amazon-web-services - 手动删除 SAM CloudFormation 堆栈中的函数后找不到函数

转载 作者:行者123 更新时间:2023-12-03 20:15:34 31 4
gpt4 key购买 nike

我正在使用 sam deploy 来部署 lambda 函数和 API 网关。它工作正常,但在我通过 AWS 控制台手动删除 lambda 函数后,它不起作用。我收到以下错误:

"ResourceStatusReason": "Function not found: 
arn:aws:lambda:ap-southeast-2:286334053171:function:polaroid (Service:
AWSLambdaInternal; Status Code: 404; Error Code: ResourceNotFoundException;
Request ID: b431cbfc-7772-11e9-8022-1b92fa2cfa9e)

删除 lambda 并进行刷新部署的正确方法是什么?如果发生这种情况,我如何强制 SAM 创建缺失的 lambda 函数?

模板 yaml 中的 lambda 如下所示:

...
Resources:
PolaroidFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: test
CodeUri: ./lambdas
Handler: lib/index.fun
Runtime: nodejs8.10
Events:
polaroid:
Type: Api
Properties:
Path: /test
Method: post
...

最佳答案

我想您已经通过惨痛的教训了解到,永远不应该手动删除 SAM 或 CloudFormation 管理的资源。

一般情况下,如果您只是想更改功能,只需调用 sam buildsam deploy 即可部署新版本。无需删除任何内容。如果您需要更高级的工作流程,您将需要阅读博客文章。没有一种正确的方法可以做到这一点。

要解决您眼前的问题,您可以执行以下操作。1

首先,您需要获取生成的AWS CloudFormation模板:

▶ aws cloudformation get-template --stack-name HelloWorld \
--template-stage Processed --query TemplateBody | cfn-flip -y > processed.yml

接下来,您需要注释掉刚刚创建的 processed.yml 文件中的函数,并注释掉引用该函数的 Lambda Permissions。也保存原始 processed.yml 文件的备份。

此外,如果可能,请通过从 AWS 控制台获取 CloudFormation 在构建堆栈时计算的实际值来更新对其的任何其他模板引用。例如,如果您引用了 ${HelloWorldFunction.Arn},则可能需要使用 arn:aws:lambda:ap-southeast-2 之类的字符串更新模板中的这些引用: 123456789012:函数:HelloWorld-HelloWorldFunction-1NJGQI7GEAUM1

接下来,使用 AWS CloudFormation 命令验证模板:

▶ aws cloudformation validate-template --template-body file://processed.yml
{
"CapabilitiesReason": "The following resource(s) require capabilities: [AWS::IAM::Role]",
"Description": "sam-app\nSample SAM Template for sam-app\n",
"Parameters": [],
"Capabilities": [
"CAPABILITY_IAM"
]
}

接下来,您将使用此修改后的模板更新堆栈。通过以这种方式更新堆栈,从 CloudFormation 的角度来看,您的模板和真实状态可以恢复同步:

▶ aws cloudformation update-stack --template-body file://processed.yml --stack-name HelloWorld --capabilities CAPABILITY_IAM                        
{
"StackId": "arn:aws:cloudformation:ap-southeast-2:885164491973:stack/HelloWorld/af2c6810-7884-11e9-9bb3-068b1a8e1450"
}

如果一切顺利,您的堆栈将进入 UPDATE_COMPLETE 状态。太棒了!

最后,将所有注释掉的资​​源取消注释,并恢复所有原始值。然后第二次更新堆栈,您的堆栈应该恢复到原始状态。

另请参阅:


1 请注意,我使用 SAM 附带的默认 HelloWorld Python 2.7 示例测试了此方法。

关于amazon-web-services - 手动删除 SAM CloudFormation 堆栈中的函数后找不到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56159381/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com