无法从此帐户的参数存储中获取参数(参数值)

时间:2018-08-19 13:40:29

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

我得到了错误:

$ 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

4 个答案:

答案 0 :(得分:2)

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

我们的情况是:

使用参数StageName创建的堆栈,其类型为String默认开发。

然后,我们转向使用参数存储,并将参数定义更新为AWS :: SSM :: Parameter :: Value类型,并使用参数存储路径作为默认值。

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

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

对我们来说,最简单的解决方法是删除堆栈并重新创建,但是对于其他人来说这可能是一个问题。如果有人有更好的“升级”方法,那将是很好的发现。

我们正在使用sam deploy进行Lambda部署,因此不确定是否适用于其他堆栈的更新堆栈。

更新**

我尝试通过创建/更新堆栈重新创建此文件,但失败了,因此看来此问题仅限于pacakge / deploy升级机制

答案 1 :(得分:0)

当您将参数从一个模板传递到另一个模板时,通常会发生这种情况。

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 :(得分:0)

我有同样的问题。将现有堆栈集实例参数从字符串更新为参数存储查找,并且三个错误之一的堆栈实例更新失败,错误为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,因为我想使用参数的默认值。其他人可能需要在第二步中传递所需的参数。

希望这会有所帮助。

答案 3 :(得分:0)

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