Amazon web services 向传递给cloudformation的用户数据追加/预加?

Amazon web services 向传递给cloudformation的用户数据追加/预加?,amazon-web-services,amazon-cloudformation,Amazon Web Services,Amazon Cloudformation,我有一些userdata脚本,目前由独立EC2实例使用。 我希望能够将这些用于cloudformation,并包括对“cfn-”助手脚本的调用,以向cloudformation堆栈发送进度信号。 本质上,我希望能够在userdata脚本中预先添加一些数据,并向其中添加一些数据。 为此,我计划使用现有脚本并使用sed删除前面的shebang/script行,并将稍微修改的脚本作为参数传递到cloudformation中。此脚本在作为参数传递之前需要进行base64编码。我base64编码,然后根据

我有一些userdata脚本,目前由独立EC2实例使用。 我希望能够将这些用于cloudformation,并包括对“cfn-”助手脚本的调用,以向cloudformation堆栈发送进度信号。 本质上,我希望能够在userdata脚本中预先添加一些数据,并向其中添加一些数据。 为此,我计划使用现有脚本并使用sed删除前面的shebang/script行,并将稍微修改的脚本作为参数传递到cloudformation中。此脚本在作为参数传递之前需要进行base64编码。我base64编码,然后根据4096字节大小拆分参数大小限制。我的cloudformation模板有4个“userdata”参数字段,我可以将数据传递到其中。 这目前适用于现有脚本:

"UserData" : { "Fn::Join" : [ "", [ { "Ref" : "UserData" }, { "Ref" : "UserData2" }, { "Ref" : "UserData3" }, { "Ref" : "UserData4" }]]},
注意:我不必在这里使用base64内在函数,因为各个参数已经是base64编码的

我一直在尝试这一点,但我得到一个错误显示更进一步:

        "UserData" : {
      "Fn::Join": [
        "", [
          { "Fn::Base64": 
            { "Fn::Join": [
              "", [
                "#!/bin/bash\n",
                {"Fn::Join": ["", ["AWS_REGION=",{ "Ref" : "AWS::Region" },"\n"]]},
                {"Fn::Join": ["", ["STACKNAME=",{ "Ref" : "AWS::StackName" },"\n"]]},
                "LAUNCHCONFIG=LaunchConfig\n",
                "# # Signalling cloudformation\n",
                {"Fn::Join": ["", ["/opt/aws/bin/cfn-init -v --stack ",{ "Ref" : "AWS::StackName" }," --resource LaunchConfig --region ",{ "Ref" : "AWS::Region" },"\n"]]},
              ]
            ]}
          },
          { "Ref" : "UserData" },
          { "Ref" : "UserData2" },
          { "Ref" : "UserData3" },
          { "Ref" : "UserData4" },
          { "Fn::Base64": 
            { "Fn::Join": [
              "", [
                {"Fn::Join": ["", ["/opt/aws/bin/cfn-signal -e $? --stack ",{ "Ref" : "AWS::StackName" }," --resource AutoScalingGroup --region ",{ "Ref" : "AWS::Region" },"\n"]]},
              ]
            ]}
          }
        ]
      ]
    },
收到的错误是:

UserData似乎不是base64编码的服务:AmazonaAutoScaling;身份代码:400;错误代码:ValidationError

我希望避免这种情况,即我需要提前知道适当的参数,从而生成一个新的userdata脚本,其中包括可以作为参数传递的细节,因为我希望避免生成一个专门用于cloudformation的自定义userdata文件

我已经为四个“userdata”参数传入了空值,因此连接中的前导和尾随元素似乎没有进行base64编码。 我很欣赏对这一点的任何见解,或者我如何完成我所描述的内容。

我通常看到:

    "UserData": {
      "Fn::Base64": {
        "Fn::Join": [
          "",
          [

尝试将base64转换保持为最外层,内部层脚本不进行编码。

如果我理解的话,您正在传入已进行base64编码的用户数据。我认为你的设置不正确。userdata参数的值不应预编码。它应该是纯文本。云信息进行编码。它需要编码为发送到EC2实例,但不在配置中。你应该加入纯文本


否则,请从脚本中删除Fn::Base64块。这可能会解决问题。尽管这只是一个直截了当的猜测。

谢谢约翰。通过参数传递到cloudformation的userdata已经是base64编码的。我不知道用什么方法来传递还没有base64编码的数据。我发布的第一个代码块显示,可以将单独的base64参数组装到一个userdata脚本中。这样行。与后面的代码块不同的是,在cloudformation模板中生成的base64编码字符串的连接块不起作用。John,我不确定这是否是一个答案。你能不能换个说法,让回答的部分更清楚一些?如果这是一个答案,它也可以使用一些额外的解释。我很确定这包含了一个体面的答案。但你可能想突出回答部分,并将其余部分移动到评论中,这样你就可以在自己的帖子上发表评论,即使没有评论特权。