【问题标题】:AWS Cloudformation output double quotes in a file using Fn::JoinAWS Cloudformation 使用 Fn::Join 在文件中输出双引号
【发布时间】:2015-02-03 03:44:45
【问题描述】:

经过大量研究和挫折,我并没有完全得到我希望的输出。

例如,所需的文件输出是

"accessKeyId":"UIIUHO]SOMEKEY[SHPIUIUHIU"

但我得到的是

accessKeyId:UIIUHO]SOMEKEY[SHPIUIUHIU

下面是 AWS Cloudformation 模板中的一行

{"Fn::Join": ["", ["echo \" accessKeyId:", {"Ref": "AccessKeyId"}, "\" >>  /home/ubuntu/myfile.json"] ] }, 

我尝试在 echo 语句中添加 \" ,但没有输出引号。有人可以说明如何在上面生成所需的输出吗?

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    实际上是正确转义引号的问题。

    原因是:CloudFormation 字符串中的\" 转义为"(双引号)。

    例如,"hello \"me\"" 给你:

    hello "me"
    

    在您的行中,您真正提供给 bash 的是:

    echo " accessKeyId:XXXXX" >> /home/ubuntu/myfile.json
    

    考虑到 bash 使用引号,你会得到字符串

    accessKeyId:XXXXX
    

    在你的/home/ubuntu/myfile.json

    为了解决您的问题,我建议使用:

    {"Fn::Join": ["", ["echo '\"accessKeyId\":\"", {"Ref": "AccessKeyId"}, "\"' >>  /home/ubuntu/myfile.json"] ] },
    

    转义为

    echo '"accessKeyId":"XXXXX"' >>  /home/ubuntu/myfile.json
    

    (难以阅读:echo 使用的整个字符串都在单引号内)。

    我现在无法尝试,但应该可以解决问题。

    【讨论】:

    • 谢谢!第一个和最后一个单引号做到了。
    • 已创建转义和编码,以便为 IT 人员提供全职工作! :)
    【解决方案2】:

    如果您尝试在 CloudFormation 启动的 EC2 实例上生成文件,我会推荐以下方法:

    在“资源”部分(相应地调整您的政策):

         "User": {
                "Type": "AWS::IAM::User",
                "Properties": {
                    "Path": "/",
                    "Policies": [
                        {
                            "PolicyName": "AllPrivileges",
                            "PolicyDocument": {
                                "Statement": [
                                    {
                                        "Effect": "Allow",
                                        "Action": [
                                            "*"
                                        ],
                                        "Resource": [ "*" ]
                                    }
                                ]
                            }
                        }
                    ]
                }
        },
        "AccessKey" : {
           "Type" : "AWS::IAM::AccessKey",
           "Properties" : {
              "UserName" : { "Ref" : "User" }
           }
        },
    

    在 EC2 实例资源部分:

            "Metadata" : {
                "AWS::CloudFormation::Init" : {
                  "config" : {
                        "files" : {
                          "/home/ec2-user/.aws/config" : {
                            "content" : { "Fn::Join" : ["", [
                              "[profile eb-cli]", "\n",
                              "aws_access_key_id = ", { "Ref" : "AccessKey" }, "\n",
                              "aws_secret_access_key = ", { "Fn::GetAtt" : [ "AccessKey", "SecretAccessKey" ] }, "\n"
                            ]]},
                            "mode" : "000600",
                            "owner" : "ec2-user",
                            "group" : "ec2-user"
                          }
                        },
    

    在输出中添加双引号应该像转义它们一样简单,例如

              "files" : {
                          "/home/ec2-user/.aws/config" : {
                            "content" : { "Fn::Join" : ["", [
                              "[profile eb-cli]", "\n",
                              "\"aws_access_key_id\" = \"", { "Ref" : "AccessKey" }, "\"", "\n",
                              "\"aws_secret_access_key\" = \"", { "Fn::GetAtt" : [ "AccessKey", "SecretAccessKey" ] }, , "\"", "\n"
                            ]]},
                            "mode" : "000600",
                            "owner" : "ec2-user",
                            "group" : "ec2-user"
                          }
                        },
    

    但这不是 AWS CLI 和 SDK 配置文件所必需的

    为了触发模板的AWS::Cloudformation::Init 部分,您必须显式调用cfn-init

    我通常从用户数据部分执行此操作:

                "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
                    "#!/bin/bash -x\n",
                    "exec &> /home/ec2-user/userdata.log\n",
                    "/opt/aws/bin/cfn-init --region ", { "Ref" : "AWS::Region" }, " -s ", { "Ref" : "AWS::StackId" }, " -r DockerInstance -v\n",
                    "/opt/aws/bin/cfn-signal -e $? ", { "Fn::Base64" : { "Ref" : "WaitConditionHandle" }}, "\n"
                ]] } }
    

    【讨论】:

    • 嗨 Sébastien,我最喜欢的 AWS 培训师!希望有一天能再次见到你,也许在雷恩(法国)再次见到你?!让-马克
    • :-) 也许!我的回答对你有帮助吗?
    • 谢谢塞巴斯蒂安!你的回答确实有帮助。我拥有的文件应该按照您的概述编写。我会继续研究这种方法。
    • 我编辑了我的答案以添加对 cfn-init 的引用。如果答案看起来正确,请不要犹豫接受它:-)
    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2018-05-09
    相关资源
    最近更新 更多