我正在尝试使用带有以下模板的AWS CloudFormation创建Alexa技能。我使用here和--scope alexa::ask:skills:readwrite
描述的过程生成了刷新令牌。但是,当我尝试创建堆栈时,它在Alexa::ASK::Skill
上失败,并显示错误消息:
更新技能时发生错误。原因:找不到资源。
在AlexaSkill失败之前,堆栈中的所有其他资源都会成功创建。 是什么原因导致该错误消息?
请注意:我已经尝试了多次,所以这不是一次CloudFormation错误。
编辑:这位于us-east-1(北弗吉尼亚州)地区。
更新:我认为问题与技能清单中的uri lambda端点有关,因为如果我将uri硬编码为一个不存在的函数,则会遇到相同的错误。
Parameters:
SkillName:
Type: String
BucketName:
Type: String
AlexaDeveloperClientId:
Type: String
AlexaDeveloperClientSecret:
Type: String
AlexaDeveloperRefreshToken:
Type: String
AlexaDeveloperVendorId:
Type: String
Resources:
AlexaS3ReadRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- alexa-appkit.amazon.com
Action:
- sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
AlexaSkill:
Type: Alexa::ASK::Skill
Properties:
AuthenticationConfiguration:
ClientId: !Ref AlexaDeveloperClientId
ClientSecret: !Ref AlexaDeveloperClientSecret
RefreshToken: !Ref AlexaDeveloperRefreshToken
SkillPackage:
Overrides:
Manifest:
apis:
custom:
endpoint:
uri: !GetAtt LambdaFunction.Arn
S3Bucket: !Ref BucketName
S3BucketRole: !GetAtt AlexaS3ReadRole.Arn
S3Key: !Sub ${SkillName}_skill_package.zip
VendorId: !Ref AlexaDeveloperVendorId
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
LambdaFunction:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: !Ref BucketName
S3Key: !Sub ${SkillName}_lambda_package.zip
FunctionName: !Sub bp_alexa_${SkillName}
Handler: main.lambda_handler
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: python3.7
这是堆栈事件历史记录:
2019-09-24 17:21:53 UTC-0400 bp-alexa-play-fortnite-stack ROLLBACK_COMPLETE - AWS::CloudFormation::Stack
2019-09-24 17:21:52 UTC-0400 LambdaExecutionRole DELETE_COMPLETE - AWS::IAM::Role
2019-09-24 17:21:50 UTC-0400 LambdaExecutionRole DELETE_IN_PROGRESS - AWS::IAM::Role
2019-09-24 17:21:50 UTC-0400 AlexaS3ReadRole DELETE_COMPLETE - AWS::IAM::Role
2019-09-24 17:21:49 UTC-0400 LambdaFunction DELETE_COMPLETE - AWS::Lambda::Function
2019-09-24 17:21:49 UTC-0400 LambdaFunction DELETE_IN_PROGRESS - AWS::Lambda::Function
2019-09-24 17:21:49 UTC-0400 AlexaS3ReadRole DELETE_IN_PROGRESS - AWS::IAM::Role
2019-09-24 17:21:48 UTC-0400 AlexaSkill DELETE_COMPLETE - Alexa::ASK::Skill
2019-09-24 17:21:46 UTC-0400 AlexaSkill DELETE_IN_PROGRESS - Alexa::ASK::Skill
2019-09-24 17:21:45 UTC-0400 bp-alexa-play-fortnite-stack ROLLBACK_IN_PROGRESS The following resource(s) failed to create: [AlexaSkill]. . Rollback requested by user. AWS::CloudFormation::Stack
2019-09-24 17:21:44 UTC-0400 AlexaSkill CREATE_FAILED Error occurred while updating the skill. Cause: Resource not found. Alexa::ASK::Skill
2019-09-24 17:21:32 UTC-0400 AlexaSkill CREATE_IN_PROGRESS Resource creation Initiated Alexa::ASK::Skill
2019-09-24 17:21:29 UTC-0400 AlexaSkill CREATE_IN_PROGRESS - Alexa::ASK::Skill
2019-09-24 17:21:27 UTC-0400 LambdaFunction CREATE_COMPLETE - AWS::Lambda::Function
2019-09-24 17:21:27 UTC-0400 LambdaFunction CREATE_IN_PROGRESS Resource creation Initiated AWS::Lambda::Function
2019-09-24 17:21:26 UTC-0400 LambdaFunction CREATE_IN_PROGRESS - AWS::Lambda::Function
2019-09-24 17:21:23 UTC-0400 LambdaExecutionRole CREATE_COMPLETE - AWS::IAM::Role
2019-09-24 17:21:23 UTC-0400 AlexaS3ReadRole CREATE_COMPLETE - AWS::IAM::Role
2019-09-24 17:20:13 UTC-0400 LambdaExecutionRole CREATE_IN_PROGRESS Resource creation Initiated AWS::IAM::Role
2019-09-24 17:20:12 UTC-0400 LambdaExecutionRole CREATE_IN_PROGRESS - AWS::IAM::Role
2019-09-24 17:20:12 UTC-0400 AlexaS3ReadRole CREATE_IN_PROGRESS Resource creation Initiated AWS::IAM::Role
2019-09-24 17:20:11 UTC-0400 AlexaS3ReadRole CREATE_IN_PROGRESS - AWS::IAM::Role
2019-09-24 17:20:08 UTC-0400 bp-alexa-play-fortnite-stack CREATE_IN_PROGRESS User Initiated AWS::CloudFormation::Stack
答案 0 :(得分:1)
您极有可能尝试将堆栈部署在资源不可用的区域中。如果可能的话,请先尝试将其部署在弗吉尼亚州。
答案 1 :(得分:1)
我几乎整天都在为此作斗争,而且我想我已经缩小了范围。
每当我执行堆栈初始创建时,都必须完全忽略端点URI(来自skill.json清单和Alexa :: ASK :: Skill Overrides)。这使CloudFormation可以成功创建技能,而无需对端点进行任何设置。然后,我可以将更新包含在您的模板中推送到包含Overrides的template.yml
这使CloudFormation能够成功更新ASK技能以使用指定的端点(ARN)。问题是,如果我必须从头开始删除并重新创建堆栈,则必须插入一个提交,该注释在Overrides部分中注释掉,然后在堆栈创建成功之后插入仅回滚所做更改的提交。我只能猜测存在一个错误,导致!GetAtt
不能以某种方式正确解决,或者在创建ASK资源时,该引用的函数对ASK资源而言是不可见的。
答案 2 :(得分:-1)
您可能不需要/不需要声明覆盖部分。特别是如果您打算使用诸如ASK CLI之类的东西进行更新等,因为每次您重新部署CLI时,都需要在cloudformation上发送一个任意更新以覆盖将在技能清单中定义的ARN。这可能会使给定时间的实际端点混乱。我想说的就是在技能清单中声明该端点。相反,您可以将lambda ARN放入输出部分,并将其放入清单或控制台中。
另一个建议是,当您使用lambda来实现Alexa技能时,请使用别名和版本。在进行更新并且需要运行两个版本的代码(实时版本和开发版本)时,使用“别名和版本”将为您提供大量帮助。