【问题标题】:CloudFormation fails to create AlexaSkill - Resource not foundCloudFormation 无法创建 AlexaSkill - 找不到资源
【发布时间】:2019-10-07 00:37:30
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 你在哪个地区运行它?
  • 资源 AlexaS3ReadRole 中的托管策略 ARN 看起来不正确。是错字吗? arn:aws:iam::aws:policy/AmazonS3FullyAccess 应该是 arn:aws:iam::aws:policy/AmazonS3FullAccess
  • 是的,谢谢,它实际上是我一直在使用的 AmazonS3ReadOnlyAccess,我会更新
  • 当我遇到这样的错误时,我使用AWS Console 手动创建资源,然后使用现有资源创建CFT 并相应地更改CFT
  • 感谢@Asdfg,我只是尝试了这个并遇到了同样的错误。也尝试在清单中硬编码现有 Lambda 函数的 Arn。

标签: amazon-web-services amazon-cloudformation alexa alexa-skills-kit


【解决方案1】:

我几乎整天都在与这个作斗争,我想我已经缩小了范围。

每当我执行堆栈初始创建时,我都必须完全省略端点 URI(来自 Skill.json 清单和 Alexa::ASK::Skill 覆盖)。这使 CloudFormation 无需对端点进行任何设置即可成功创建技能。然后,我可以将更新推送到包含模板中的覆盖的 template.yml

这使 CloudFormation 能够成功更新 ASK 技能以使用指定的端点 (ARN)。问题是,如果我必须从头开始删除和重新创建堆栈,我必须在堆栈创建成功后插入一个退出 Overrides 部分的提交,然后是一个将更改回滚的提交。我只能猜测存在一个错误,即 !GetAtt 以某种方式无法正确解析,或者引用的函数在创建时对 ASK 资源不可见。

【讨论】:

  • 最终,我认为 Alexa::ASK::Skill 考虑不周,因为它不完全支持 CloudFormation 中的资源。我正在调查 CDK 是否对这种情况有所帮助。如果做不到这一点,我想我将求助于 CloudFormation 自定义资源类型来支持我的 Alexa 基础架构即代码。
【解决方案2】:

您很可能正在尝试将堆栈部署在资源不可用的区域。如果可能,请先尝试将其部署在 N.Virginia。

【讨论】:

  • 我正在使用 us-east-1
【解决方案3】:

您可能不希望/不需要声明覆盖部分。特别是如果您计划使用 ASK CLI 之类的东西进行更新等,因为每次使用 CLI 重新部署时,您都需要在 cloudformation 上发送任意更新以覆盖您在技能清单中定义的 ARN。这可能会在给定时间对真正的端点是什么造成混淆。我想说,只需在技能清单中声明该端点即可。相反,您可以将 lambda ARN 放入输出部分,然后将其放入清单或控制台中。

另一个建议是在您将 lambda 用于 Alexa 技能时使用别名和版本。当您进行更新并且需要运行两个版本的代码(实时和开发)时,使用别名和版本会大有帮助。

【讨论】:

  • Alexa::ASK::Skill 作为 CloudFormation 资源的用例是因为人们更喜欢基础设施即代码。我必须进入 Alexa 控制台或 ASK CLI 的想法与这个用例是对立的。换句话说,我认为任何想要使用 CloudFormation 资源的人都不会关心 CLI 或控制台与同一资源的交互。
  • 我所有的 7 个实时 alexa 技能都完全通过 CI/CD 管道驱动,其中所有技能和基础设施都在代码中定义。我是 IaC 的大力支持者。不幸的是,当涉及到 Alexa 技能时,如果您真的想要执行 IaC,最好将资源端点放在技能模型中,因为您将经常修改该文件,它会覆盖您在 CFN 中的内容。 IaC 的目标是始终了解基础架构是什么,但是将单个基础架构项定义在多个位置是 IaC 的对立面。
猜你喜欢
  • 2019-08-31
  • 2020-12-12
  • 2022-11-16
  • 2019-07-26
  • 2018-02-20
  • 1970-01-01
  • 2021-07-06
  • 2020-11-15
  • 2020-12-17
相关资源
最近更新 更多