传递CloudFormation的参数文件不适用于YML

时间:2017-10-13 23:39:12

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

解决方案:不要使用yml。

我尝试传递包含db名称和db密码的参数以及我的aws cloudformation stack-create命令。我找回了一个并没有多大意义的错误。

Value of property MasterUsername must be of type String

现在,要知道的一件事是我有控制台访问权限,所以我可以真正看到密码和用户名在控制台中以设置的方式返回。它们看起来像我的字符串。

YAML版本

我在这样的模板中定义堆栈:

Parameters:
  DBUser:
    Description: db user
    Type: String
    MinLength: '4'
    MaxLength: '16'
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: some description
  DBPass:
    Description: db password
    Type: String
    MinLength: '8'
    MaxLength: '36'
    AllowedPattern: '[a-zA-Z0-9]*'
    ConstraintDescription: must contain only alphanumeric characters
Resources:
  AppNode:
   (...)
  DatabaseInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: app
      DBInstanceClass: db.t2.micro
      Engine: postgres
      EngineVersion: 10
      MasterUsername:
        - !Ref DBUser
      MasterUserPassword:
        - !Ref DBPass
  DatabaseSG:
    Type: AWS::RDS::DBSecurityGroup
    Properties:
      GroupDescription: Security Group for RDS public access
      DBSecurityGroupIngress:
        - CIDRIP: 0.0.0.0/0

在我的.env文件中,我有这个:

[
  {
    "ParameterKey": "DBUser",
    "ParameterValue": "root"
  },
  {
    "ParameterKey": "DBPass",
    "ParameterValue": "mydbpassword"
  }
]

我运行此命令:

aws cloudformation create-stack --stack-name app --template-body file://$PWD/stack.json --region us-west-2 --parameters file://$PWD/.env.json

表示文件类型。

所以我想到的第一件事就是它可能会将这些值视为空白。但情况并非如此,因为如果我根本不传递模板或参数,则会引发不同的错误。

An error occurred (ValidationError) when calling the CreateStack operation: Parameters: [DBUser, DBPass] must have values

AWS是否重新定义了字符串是什么或者在这里发生了什么?

3 个答案:

答案 0 :(得分:0)

很抱歉,yaml文件的文件不支持外部参数。

您可以在命令行中传递它们作为解决方法。

<强>参考:

https://github.com/aws/aws-cli/issues/2275

目前仍在进行中。

希望它有所帮助。

<强> EDIT1:

      MasterUsername:
        - ${DBUser}
      MasterUserPassword:
        - ${DBPass}

看起来您的YAML语法不正确。

参考:

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-general.html

答案 1 :(得分:0)

更正您的模板,如下所示。

Resources:
  AppNode:
   (...)
  DatabaseInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: app
      DBInstanceClass: db.t2.micro
      Engine: postgres
      EngineVersion: 10
      MasterUsername:
        !Ref DBUser
      MasterUserPassword:
        !Ref DBPass

当您使用- !Ref DBUser时,它表示yaml中的LIST,而不是StringMasterUserPasswordMasterUserPassword都属于String类型。 AWS支持.yml.yaml扩展。所以扩展没有问题。

答案 2 :(得分:0)

  

MasterUsername必须为字符串类型

这里有一个列表(数组),而不是字符串:

MasterUsername:
        - !Ref DBUser

改为在同一行上使用:

MasterUsername: !Ref DBUser