【问题标题】:Correct syntax for bash script as userdata for AWS runinstancebash 脚本的正确语法作为 AWS 运行实例的用户数据
【发布时间】:2016-09-05 10:20:24
【问题描述】:

每次发生特定事件时,我都会尝试通过 lambda 启动新的 ec2 实例。我有一个 bash 脚本,我想在每次启动新的 ec2 实例时运行它,并且我希望使用 runinstances 的 userdata 参数附加它。

我已经测试了脚本,当我通过 aws 控制台启动实例时它运行良好。

我怀疑这可能是因为我的语法错误。我意识到这个问题是非常基本的,但我多次尝试了各种排列,但无法启动并运行它。

   function(next) {
        console.log("INITIALIZING EC2");

        var params = {
        ImageId: 'ami-b2c934d2',
        InstanceType: 't2.micro', //'c4.4xlarge',
        MinCount: 1, MaxCount: 1,
        KeyName: 'malpem2102'
        UserData : console.log(new Buffer('#!/bin/bash \n
            sudo apt-get install awscli -y \n
            echo alarm \n
            aws configure set default.region us-west-2 \n
            aws configure set aws_access_key_id AKIAIXXXXXXXXX \n
            aws configure set aws_secret_access_key U2fyRtyakG1kAXXXXXXXXXX \n
            instance=`curl -s http://169.254.169.254/latest/meta-data/instance-id/` \n
            aws cloudwatch put-metric-alarm --alarm-name $instance --alarm-description 
            "Terminate the instance when it is idle for 10mins" --namespace "AWS/EC2" 
            --dimensions Name=InstanceId,Value=$instance --statistic Average  
            --metric-name CPUUtilization --comparison-operator LessThanThreshold 
            --threshold 5 --period 120 --evaluation-periods 5 --alarm-actions 
            arn:aws:automate:us-west-2:ec2:terminate \n').toString('base64'));
        };

【问题讨论】:

  • 请勿在论坛中发布 aws_access_key_id 和 aws_secret_access_key。
  • 检查 ec2 实例内的日志 /var/log/cloud-init.log 以了解更多确切原因。
  • console.log 返回未定义,因此您的用户数据未定义
  • 你找到解决办法了吗?我遇到了同样的问题

标签: node.js amazon-web-services amazon-ec2 aws-lambda


【解决方案1】:

我认为您只需要从代码中删除 console.log 指令即可。

【讨论】:

    【解决方案2】:

    使用 API 调用时,您需要将命令作为 base64 编码的文本字符串发送。

    因此,您需要获取原始命令数据并将其编码为 base64 以输入UserData 参数。

    例如,如果您有以下命令:

    #!/bin/bash
    curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash -
    sudo yum install -y nodejs
    sudo yum install -y git
    git clone https://github.com/user/repo
    cd repo
    npm i
    npm run start
    

    使用Base64 Decode and Encode 之类的工具编码为base64 后,您可以像这样使用您的UseData 作为参数:

    const params = {
        ImageId: 'ami-b2c934d2',
        InstanceType: 't2.micro', //'c4.4xlarge',
        MinCount: 1, MaxCount: 1,
        KeyName: 'malpem2102',
        UserData: 'IyEvYmluL2Jhc2gNCmN1cmwgLS1zaWxlbnQgLS1sb2NhdGlvbiBodHRwczovL3JwbS5ub2Rlc291cmNlLmNvbS9zZXR1cF8xMC54IHwgc3VkbyBiYXNoIC0NCnN1ZG8geXVtIGluc3RhbGwgLXkgbm9kZWpzDQpzdWRvIHl1bSBpbnN0YWxsIC15IGdpdA0KZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlcmFkZS9hd3MtZWMyLWV4YW1wbGVzDQpjZCBoYmZsDQpucG0gaQ0KbnBtIHJ1biBzdGFydA=='
    };
    

    您还可以通过以下代码使用原生 Javascript 方法进行编码:

    let commandsString = `#!/bin/bash
    curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash -
    sudo yum install -y nodejs
    sudo yum install -y git
    git clone https://github.com/user/repo
    cd repo
    npm i
    npm run start`;
    
    UserData: new Buffer(commandsString).toString('base64');
    

    更多信息,请阅读Running Commands on Your Linux Instance at Launch的文档。

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多