Amazon ec2 将SSM参数设置为EC2的环境变量-不起作用

Amazon ec2 将SSM参数设置为EC2的环境变量-不起作用,amazon-ec2,amazon-cloudformation,ssm,Amazon Ec2,Amazon Cloudformation,Ssm,我正在尝试使用Cloudformation的UserData部分获取SSM参数,并将其作为环境变量导出到EC2 脚本正在尝试将例如导出WHATS_HER_NAME=Sherlyn附加到/etc/profile文件中。但是我在/etc/profile中看到的只是导出她的名字=。该值不存在。我使用AmazonLinux2AMI 这是我的cloudformation模板 { "AWSTemplateFormatVersion": "2010-09-09", "Resources": {

我正在尝试使用Cloudformation的
UserData
部分获取SSM参数,并将其作为环境变量导出到EC2

脚本正在尝试将例如导出WHATS_HER_NAME=Sherlyn附加到
/etc/profile
文件中。但是我在
/etc/profile
中看到的只是
导出她的名字=
。该值不存在。我使用AmazonLinux2AMI

这是我的cloudformation模板

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "Ec2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "IamInstanceProfile": {
          "Ref": "Ec2instanceProfileTest"
        },
        "UserData": {
          "Fn::Base64": {
            "Fn::Join": [
              "\n",
              [
                "#!/bin/bash -xe",
                "yum update -y aws-cfn-bootstrap",
                {
                  "Fn::Sub": "/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource Ec2Instance --configsets default --region ${AWS::Region}"
                },
                {
                  "Fn::Sub": "/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}"
                },
                {
                  "Fn::Sub": "echo \"export WHATS_HER_NAME=$(aws ssm get-parameter --name WhatsHerName --region ${AWS::Region} --query 'Parameter.Value')\" >> /etc/profile"
                }
              ]
            ]
          }
        }
      }
    },
    "GetSSMParameterPolicy": {
      "Type": "AWS::IAM::Policy",
      "Properties": {
        "PolicyName": "GetSsmProperty",
        "PolicyDocument": {
          "Statement": [
            {
              "Effect": "Allow",
              "Resource": "arn:aws:ssm:ap-southeast-2:012345678901:parameter/WhatsHerName",
              "Action": [
                "ssm:GetParameters",
                "ssm:GetParameter"
              ]
            },
            {
              "Effect": "Allow",
              "Resource": "*",
              "Action": [
                "ssm:DescribeParameters"
              ]
            }
          ]
        },
        "Roles": [
          {
            "Ref": "InstanceRole"
          }
        ]
      }
    },
    "InstanceRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "ec2.amazonaws.com"
                ]
              },
              "Action": [
                "sts:AssumeRole"
              ]
            }
          ]
        },
        "Path": "/"
      }
    },
    "BasicParameter": {
      "Type": "AWS::SSM::Parameter",
      "Properties": {
        "Name": "WhatsHerName",
        "Type": "String",
        "Value": "Sherlyn"
      }
    }
  }
}

非常感谢您的帮助。

我不喜欢将JSON用于CloudFormation模板,因此我无法提供JSON格式的解决方案,但这里是YAML格式的

UserData:
  Fn::Base64: !Sub
  - |
    #!/bin/bash -xe
    yum update -y aws-cfn-bootstrap
    /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource Ec2Instance --configsets default --region ${AWS::Region}
    /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}
    echo export WHATS_HER_NAME=${WhatsHerNameParameter} >> /etc/profile
  - WhatsHerNameParameter: {{resolve:ssm:WhatsHerName:1}}
你可以阅读更多关于

上面的代码段正在替换${AWS::StackName}和${AWS::Region},当它到达${WhatsHerNameParameter}时,它会检查SSM参数并将其替换到UserData中

这意味着UserData在到达EC2实例之前就已经完成了。

我发现了两个问题:

  • 您的实例不依赖于参数,因此可以在实例之后创建参数。当实例试图读取空参数时,它不在那里。使用
    DependsOn:[BasicParameter]
  • 示例代码中没有包含
    Ec2instanceProfileTest
    。您确定它正确使用了
    getssmpareterpolicy
    ?如果在堆栈完成后运行
    aws ssm get parameter
    命令,可以正确获取值吗?如果不能,则可能存在权限错误。检查结果

  • 我会尝试类似于
    “Fn::Sub”:“echo\”export WHATS\u HER\u NAME=$(aws ssm get parameter--NAME WhatsHerName--region${aws::region}--query'parameter.Value'2>/tmp/find the error)\“>/etc/profile”
    然后
    一旦机器启动,sudo cat/tmp/find the error
    $(…)
    丢弃stderr,但这会将其写入一个文件,也许会让您了解它为什么不起作用。@Michael sqlbot我尝试过,但是
    /tmp/find错误
    文件没有创建,这是非常意外的。2)是的,因为我可以ssh到实例中并执行
    获取参数
    ,是的,值在那里,因此可能只是创建的顺序。添加
    DependsOn
    。现在测试它会让您知道。同时,这是一个语句“Fn::Sub”:“echo\”export WHATS_HER_NAME=$(aws ssm get parameter--NAME WhatsHerName--region${aws::region}--query'parameter.Value')\“>/etc/profile”`对您来说很好,
    /etc/profile
    ,我不确定您为什么没有得到
    WhatsHerName参数:{resolve:ssm:WhatsHerName:1}}
    导出后状态?否,因为您正在替换它,所以它在导出前得到解决(类似于DependsOn)