【问题标题】:Unable to fetch paramters (Param Value) from parameter store for this account无法从此帐户的参数存储中获取参数(参数值)
【发布时间】:2022-04-29 21:41:24
【问题描述】:

我得到错误:

$ aws cloudformation deploy --template-file ./packaged-stack.yml --stack-name mystackname --capabilities CAPABILITY_NAMED_IAM`


An error occurred (ValidationError) when calling the CreateChangeSet operation: Unable to fetch parameters [XXX] from parameter store for this account.

这里有什么问题?

奇怪的是XXX 是来自参数存储的值,因此 CloudFormation 实际上能够获取该值......但它似乎试图从名称为它得到的值的参数中读取...... .我觉得我的用法不对?

AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: '...'

Parameters:
  BaseStack:
    Type: AWS::SSM::Parameter::Value<String>
    Default: /some/thing/baseStack

在本例中/some/thing/baseStack 中存储的值是XXX

【问题讨论】:

标签: amazon-web-services amazon-cloudformation ssm


【解决方案1】:

这通常发生在您将参数从一个模板传递到另一个模板时。

Template 1 has parameter reading from SSM store and passing it to another template
Parameters:
  SNSTopicArnParam:
    Description: Arn of the SNS topic
    Type: AWS::SSM::Parameter::Value<String>
    Default: /arn/topics/topic1
Resources:
  CallOtherStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: someurl/template2.yaml
      Parameters:
        SNSTopicArn: !Ref SNSTopicArnParam

并且模板 2 具有以下参数和资源(将因无法获取参数错误而出错。)

Parameters:
  SNSTopicArnFromCaller:
    Description: Arn of the SNS topic
    Type: AWS::SSM::Parameter::Value<String>
    Default: /arn/topics/topic1
Resources:
  NewSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Parameters:
        TopicArn: !Ref SNSTopicArnFromCaller
        Endpoint: someValue
        Protocol: SQS

这是因为模板一将具有 /arn/topics/topic1 的值(主题的 arn),并在调用时将 arn 值传递给 template2。并且 template2 具有值的类型作为另一个 SSM 参数。

要解决这个问题,template2 参数类型应该只是实际参数值的类型。在这种情况下,它应该是 String

所以,模板 2 应该如下更新才能正常工作

Parameters:
  SNSTopicArnFromCaller:
    Description: Arn of the SNS topic
    Type: String
Resources:
  NewSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Parameters:
        TopicArn: !Ref SNSTopicArnFromCaller
        Endpoint: someValue
        Protocol: SQS

【讨论】:

    【解决方案2】:

    我们遇到了类似的问题,发现在更新参数定义时遇到了这个问题。

    我们的情况是:

    使用参数 StageName 和类型 String 默认 Dev 创建的堆栈。

    然后我们转而使用参数存储并将参数定义更新为 AWS::SSM::Parameter::Value 类型,并使用参数存储路径进行默认设置。

    调用更新堆栈时,Cloudformation 正在读取现有值“Dev”并将其作为默认值传递给参数,因此它在路径 Dev 处查找参数存储值。显然这不存在并导致错误:

    调用 CreateChangeSet 操作时发生错误 (ValidationError):无法从该帐户的参数存储中获取参数 [Dev]。

    对我们来说最简单的解决方法是删除堆栈并重新创建,但可以看到这对其他人来说是个问题。如果有人有更好的“升级”方法,最好找出来。

    我们使用 sam deploy 为 Lambda 进行部署,因此不确定这是否适用于其他堆栈的 update-stack。

    更新**

    我尝试通过创建/更新堆栈重新创建它但失败了,所以看起来这个问题仅限于 pacakge/deploy 升级机制

    【讨论】:

      【解决方案3】:

      似乎更新堆栈不会更新堆栈参数的默认值。如果要更新默认值,则需要重命名参数,然后更新堆栈。一旦成功,您可以立即将参数重命名。

      旁注:如果您只需要 cloudformation yaml 中的“局部变量”或“配置”数据,只需使用映射部分来存储配置而不是参数默认值。老实说,参数默认值的这种行为非常不直观,我们只是在我们的代码库中完全禁止它们。

      【讨论】:

      • 这是最简单的答案,对我来说效果最好(在我的情况下不需要改回名称)。
      • 太棒了!这是一个快速有效的解决方法。谢谢!我更喜欢这样做,而不是像 SteveB 建议的那样删除和重新创建堆栈。
      • 这也是我的修复!我很困惑为什么这种行为只发生在一个环境/帐户中。
      【解决方案4】:

      我遇到了同样的问题。将现有堆栈集实例参数从字符串更新为参数存储查找,三个帐户之一的堆栈实例更新失败,错误为 Unable to fetch parameters ['string'] from parameter store for this account。不幸的是,由于这些实例位于生产帐户中,因此无法删除和重新部署。

      我向 AWS 提出了一个支持案例,他们同意此线程中的诊断。以下是有效的建议。

      1. 在指定参数列表但没有参数值的同时更新卡住的堆栈实例。这应该将参数重置回 StackSet 默认值。
        • 我使用以下 AWS CLI 命令成功地做到了这一点: aws cloudformation update-stack-instances --stack-set-name stack-set-name --accounts "############" --regions us-east-1 --parameter-overrides
      2. 尝试使用所需参数再次更新堆栈实例。

      在我的情况下,我不需要执行第 2 步,因为我想使用参数的默认值。其他人可能需要在第二步中传递所需的参数。

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        使用嵌套堆栈时,参数类型必须是字符串,因为主堆栈中参数的引用将导致成为字符串

        主模板 -> 根堆栈

        "Parameters": {
          "MyParam": {
            "Description": "My description",
            "Type": "AWS::SSM::Parameter::Value<String>"
          }
        }
        ...
        "MyNestedStack": {
          "Type": "AWS::CloudFormation::Stack",
          "Properties": {
            "Parameters": {
              "MyParamFromMain": { "Ref": "MyParam" }
            }
          }
        }
        

        第二个模板 -> 嵌套/子堆栈

        "Parameters": {
          "MyParamFromMain": {
            "Description": "My description",
            "Type": "String"
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-17
          • 2022-10-01
          • 1970-01-01
          • 2021-01-04
          • 1970-01-01
          • 1970-01-01
          • 2020-04-26
          • 1970-01-01
          相关资源
          最近更新 更多