Функция не найдена после ручного удаления функции из стека SAM CloudFormation - PullRequest
0 голосов
/ 16 мая 2019

Я использую sam deploy для развертывания лямбда-функции и шлюза API. Он работает нормально, но не работает после того, как я вручную удалил лямбда-функцию через консоль AWS. Я получил ниже ошибки:

"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)

Как правильно удалить лямбду и выполнить развертывание обновления? Если это произойдет, как я могу заставить SAM создать отсутствующую лямбда-функцию?

Моя лямбда в шаблоне yaml выглядит так:

...
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
...

1 Ответ

1 голос
/ 17 мая 2019

Полагаю, вы уже научились тому, как никогда не удалять вручную ресурсы, управляемые SAM или CloudFormation.

В общем, если вы просто хотите изменить функцию, вы можете просто вызвать sam build и sam deploy, и будет развернута ее новая версия. Нет необходимости что-либо удалять. Если вам нужен более продвинутый рабочий процесс, вам нужно будет читать сообщения в блоге. Нет единственно правильного способа сделать это.

Однако, чтобы решить вашу непосредственную проблему, вот что вы можете сделать. 1

Для начала вам необходимо получить сгенерированный шаблон AWS CloudFormation:

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

Далее необходимо закомментировать функцию в только что созданном файле processed.yml, а также закомментировать лямбда-разрешения, которые к ней относятся. Также сохраните резервную копию исходного файла 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"
    ]
}

Далее вы обновите стек, используя этот измененный шаблон. Обновив таким образом стек, вы получите синхронизированный шаблон и реальное состояние с точки зрения 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 Обратите внимание, что я тестировал этот метод, используя стандартный пример HelloWorld Python 2.7, поставляемый с SAM.

...