Полагаю, вы уже научились тому, как никогда не удалять вручную ресурсы, управляемые 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.