AWS sam deploy命令超时 堆栈长期处于REVIEW_IN_PROGRESS状态
问题描述
我尝试通过如下template.yaml文件部署一个非常简单的函数,部署后会生成名为samcli-deploy1629444458的变更集,该变更集长期处于CREATE_IN_PROGRESS状态,查看详情未发现任何变更内容,堆栈的Events、Resources、Output板块也无任何记录。sam deploy命令执行失败,同时堆栈停留在REVIEW_IN_PROGRESS状态,需要手动删除。
所用template.yaml内容如下:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > AWS Test backend. Globals: Function: Timeout: 3 Runtime: nodejs12.x Resources: HelloWorldApi: Type: AWS::Serverless:Api Properties: Name:API StageName: Prod HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Events: HelloWorld: Type: Api Properties: RestApiId: !Ref HelloWorldApi Path: /hello Method: get
sam deploy执行报错输出
Waiting for changeset to be created.. Traceback (most recent call last): File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/lib/deploy/deployer.py", line 292, in wait_for_changeset waiter.wait(ChangeSetName=changeset_id, StackName=stack_name, WaiterConfig=waiter_config) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/botocore/waiter.py", line 53, in wait Waiter.wait(self, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/botocore/waiter.py", line 362, in wait raise WaiterError( botocore.exceptions.WaiterError: Waiter ChangeSetCreateComplete failed: Max attempts exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/bin/sam", line 8, in <module> sys.exit(cli()) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/click/core.py", line 829, in __call__ return self.main(*args, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/click/core.py", line 782, in main rv = self.invoke(ctx) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/click/core.py", line 1259, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/click/core.py", line 1066, in invoke return ctx.invoke(self.callback, **ctx.params) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/click/core.py", line 610, in invoke return callback(*args, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/lib/cli_validation/image_repository_validation.py", line 76, in wrapped return func(*args, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/click/decorators.py", line 73, in new_func return ctx.invoke(f, obj, *args, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/click/core.py", line 610, in invoke return callback(*args, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/lib/telemetry/metric.py", line 153, in wrapped raise exception # pylint: disable=raising-bad-type File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/lib/telemetry/metric.py", line 122, in wrapped return_value = func(*args, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/lib/utils/version_checker.py", line 42, in wrapped actual_result = func(*args, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/cli/main.py", line 90, in wrapper return func(*args, **kwargs) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/commands/deploy/command.py", line 206, in cli do_cli( File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/commands/deploy/command.py", line 345, in do_cli deploy_context.run() File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/commands/deploy/deploy_context.py", line 155, in run return self.deploy( File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/commands/deploy/deploy_context.py", line 229, in deploy result, changeset_type = self.deployer.create_and_wait_for_changeset( File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/lib/deploy/deployer.py", line 458, in create_and_wait_for_changeset self.wait_for_changeset(result["Id"], stack_name) File "/usr/local/Cellar/aws-sam-cli/1.28.0/libexec/lib/python3.8/site-packages/samcli/lib/deploy/deployer.py", line 297, in wait_for_changeset reason = resp["StatusReason"] KeyError: 'StatusReason'
控制台执行状态截图:
后续补充报错
如果在sam deploy命令失败后不手动删除堆栈,等待足够长时间后,堆栈最终会返回如下错误:
1 validation error detected: Value '[AWS::Serverless:Api, AWS::IAM::Role, AWS::Lambda::Function, AWS::Lambda::Permission]' at 'typeNameList' failed to satisfy constraint: Member must satisfy constraint: [Member must have length less than or equal to 204, Member must have length greater than or equal to 10, Member must satisfy regular expression pattern: [A-Za-z0-9]{2,64}::[A-Za-z0-9]{2,64}::[A-Za-z0-9]{2,64}(::MODULE){0,1}]
解决方案
问题根因为template.yaml中HelloWorldApi资源的类型拼写错误:当前写的是AWS::Serverless:Api,仅包含1个半角冒号作为分隔符,不符合CloudFormation资源类型[前缀]::[服务]::[资源]的三段式规范,正确写法应为AWS::Serverless::Api(两个半角冒号分隔)。
修正后的资源定义片段如下:
Resources: HelloWorldApi: Type: AWS::Serverless::Api Properties: Name: API StageName: Prod
修改yaml文件后,先删除当前处于REVIEW_IN_PROGRESS状态的异常堆栈,再重新执行sam build、sam deploy即可完成正常部署。
内容的提问来源于stack exchange,提问作者Deniz
相关产品推荐
相关产品推荐

