如何在 CloudFormation::Init 中动态添加用户子句(或者如何以编程方式设置模板键)

如何在 CloudFormation::Init 中动态添加用户子句(或者如何以编程方式设置模板键)

AWS::CloudFormation::Init文档允许在 ec2 实例上创建用户规范,因此:

"users" : {
    "myUser" : {
        "groups" : ["groupOne", "groupTwo"],
        "uid" : "50",
        "homeDir" : "/tmp"
    }
}

我正在尝试以编程方式替换“myUser”。使用 Ref: 不起作用:

"users": {
    "{ "Ref": "UserName" }": {
        "groups": [ "groupOne", "groupTwo" ]
    }
}

在 Ref 行上显示“模板格式错误:JSON 格式不正确”。我尝试了大约 800 种不同的方法来输入该代码,带引号和不带引号,使用不同的函数代替 Ref,但都无济于事。不幸的是,我不知道如何诊断这是否真的只是“你漏了一个逗号”之类的问题,或者尝试以编程方式替换“myUser”是否存在更大的问题。如果是后者,解决方案是什么。

有任何想法吗?

谢谢!

答案1

这无法CloudFormation直接通过服务实现。内部函数Ref返回指定参数或资源的值。然后可以将该值与 JSON/YAML 键关联。但它不能直接作为键,因为 JSON/YAML 对象是以键/值对的形式编写的。

我有两个想法可以解决此问题:

  • 使用CloudFormation模板增强模板功能,YAMLJinja2权杖或者堆栈项目可以轻松做到这一点
  • 直接创建用户EC2 user data,您可以尝试这样的操作:

  "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
    "#!/bin/bash -xe\n",

    "useradd ",
    { "Ref": "UserName" },
    "\n",
  ]]}}

相关内容