通过用户数据在 EC2 实例上安装 CodeDeploy 代理

Posted

技术标签:

【中文标题】通过用户数据在 EC2 实例上安装 CodeDeploy 代理【英文标题】:Installing CodeDeploy Agent on EC2 Instance via User Data 【发布时间】:2021-12-24 02:31:14 【问题描述】:

我希望在 EC2 实例上安装 CodeDeploy 代理,并通过 CloudFormation 部署用户数据。 Here is the script I'm using from AWS

但是,当我将脚本放在 CloudFormation 中我的 EC2 实例的 UserData 属性中时,我从 linter 收到此错误:

E1019 Parameter PLAT for Fn::Sub not found at Resources/Server/Properties/UserData/Fn::Base64/Fn::Sub

这是sn-p:

UserData:
        'Fn::Base64': !Sub |
          #!/bin/bash -xe

          ## Code Deploy Agent Bootstrap Script##


          exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
          AUTOUPDATE=false

          function installdep()

          if [ $PLAT = "ubuntu" ]; then

            apt-get -y update
            # Satisfying even ubuntu older versions.
            apt-get -y install jq awscli ruby2.0 || apt-get -y install jq awscli ruby



          elif [ $PLAT = "amz" ]; then
            yum -y update
            yum install -y aws-cli ruby jq

          fi

          

          function platformize()

          #Linux OS detection#
          if hash lsb_release; then
            echo "Ubuntu server OS detected"
            export PLAT="ubuntu"


          elif hash yum; then
            echo "Amazon Linux detected"
            export PLAT="amz"

          else
            echo "Unsupported release"
            exit 1

          fi
          


          function execute()

          if [ $PLAT = "ubuntu" ]; then

            cd /tmp/
            wget https://aws-codedeploy-$REGION.s3.amazonaws.com/latest/install
            chmod +x ./install

            if ./install auto; then
              echo "Instalation completed"
                if ! $AUTOUPDATE; then
                      echo "Disabling Auto Update"
                      sed -i '/@reboot/d' /etc/cron.d/codedeploy-agent-update
                      chattr +i /etc/cron.d/codedeploy-agent-update
                      rm -f /tmp/install
                fi
              exit 0
            else
              echo "Instalation script failed, please investigate"
              rm -f /tmp/install
              exit 1
            fi

          elif [ $PLAT = "amz" ]; then

            cd /tmp/
            wget https://aws-codedeploy-$REGION.s3.amazonaws.com/latest/install
            chmod +x ./install

              if ./install auto; then
                echo "Instalation completed"
                  if ! $AUTOUPDATE; then
                      echo "Disabling auto update"
                      sed -i '/@reboot/d' /etc/cron.d/codedeploy-agent-update
                      chattr +i /etc/cron.d/codedeploy-agent-update
                      rm -f /tmp/install
                  fi
                exit 0
              else
                echo "Instalation script failed, please investigate"
                rm -f /tmp/install
                exit 1
              fi

          else
            echo "Unsupported platform ''$PLAT''"
          fi

          

          platformize
          installdep
          REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r ".region")
          execute

我在这里缺少什么?当通过控制台创建实例时,此脚本在用户数据中运行良好。提前致谢!

【问题讨论】:

$ 专用于 cloudformation Sub 功能。您需要使用! 转义它,例如$!PLAT(或删除,因为在您使用它们的任何地方的脚本中都不需要它们。 【参考方案1】:

@jordanm 评论的提示。这解决了我的问题。

【讨论】:

以上是关于通过用户数据在 EC2 实例上安装 CodeDeploy 代理的主要内容,如果未能解决你的问题,请参考以下文章

在 EC2 实例上使用用户数据脚本运行 ansible-playbook

AWS SSH 访问密钥生成过程并安装在 EC2 上

如何通过 Ansible 在 AWS EC2 实例上部署 Consul

在 AWS 中的 SUSE Linux EC2 实例上安装 SSM 代理和角色确保启动

如何与用户一起备份 Ec2 linux 实例

无法通过公共 ip 访问 EC2 实例上的站点