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

Zha*_* Yi 4 amazon-web-services aws-cloudformation aws-lambda aws-sam

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

删除 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
...
Run Code Online (Sandbox Code Playgroud)

Ale*_*vey 6

我想您已经学会了永远不要手动删除由 SAM 或 CloudFormation 管理的资源的艰难方法。

一般来说,如果你只是想改变函数,你可以直接调用sam buildand sam deploy,新版本就会被部署。无需删除任何内容。如果您需要更高级的工作流程,则需要阅读博客文章。没有一种正确的方法可以做到这一点。

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

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

? aws cloudformation get-template --stack-name HelloWorld \
    --template-stage Processed --query TemplateBody | cfn-flip -y > processed.yml
Run Code Online (Sandbox Code Playgroud)

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

此外,如果可能,使用您构建堆栈时 CloudFormation 计算的实际值更新对其的任何其他模板引用,方法是从您的 AWS 控制台获取它们。例如,如果您有对${HelloWorldFunction.Arn}您的引用,则可能必须使用类似arn:aws:lambda:ap-southeast-2:123456789012:function: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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

接下来,您将使用此修改后的模板更新堆栈。通过以这种方式更新堆栈,您可以从 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"
}
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,您的堆栈将进入 UPDATE_COMPLETE 状态。伟大的!

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

也可以看看:


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


use*_*269 6

因此,正如其他答案中所建议的,我从控制台手动删除了该功能。

我正在从 CDK 部署堆栈

解决方案

  • 注释我手动删除的函数的 lambda 函数代码(在 cdk 中)。
  • 部署堆栈
  • 取消代码注释并重新部署


Ale*_*x R 5

我有类似的问题。就我而言,我删除了 Lambda 作为实验,同时尝试重置TRIM_HORIZON以使其重新处理 DynamoDB 流中的旧事件。

我找到了一个更简单的解决方案:

进入 CloudFormation 控制台并删除已部署的堆栈。

sam deploy之后又可以正常工作了。

  • 不要在生产中这样做。 (3认同)