Как выполнить код bash в экземпляре EC2 из документа автоматизации, развернутого с CloudFormation

#amazon-web-services #amazon-ec2 #amazon-cloudformation #aws-systems-manager

#amazon-веб-сервисы #amazon-ec2 #aws-cloudformation #aws-ssm

Вопрос:

Я пытаюсь выполнить код bash через aws: runcommand. Я взял и адаптировал приведенный ниже фрагмент из репозитория AWS для развертывания конвейера Golden Image

То, что вы видите ниже, развернуто с помощью стека CloudFormation. Формируется объект AWS::SSM::Document, передающий различные входные данные. Это один из основных этапов моего документа автоматизации. Я пытаюсь обновить ОС моего экземпляра.

 {

   "name": "updateOSSoftware",

   "action": "aws:runCommand",

   "maxAttempts": 3,

   "timeoutSeconds": 3600,

   "onFailure": "Abort",

   "inputs": {

       "DocumentName": "AWS-RunShellScript",

       "InstanceIds": [

           "{{startInstances.InstanceIds}}"

       ],

       "Parameters": {

           "commands": [

               "export https_proxy=http://myproxy.com:myport",

                "export https_proxy='{{OutBoundProxy}}'",

                "set -e",

               "[ -x "$(which wget)" ] amp;amp; get_contents='wget $1 -O -'",

               "[ -x "$(which curl)" ] amp;amp; get_contents='curl -s -f $1'",

               "eval $get_contents https://aws-ssm-downloads-eu-west-1.s3.amazonaws.com/scripts/aws-update-linux-instance > /tmp/aws-update-linux-instance",

               "chmod  x /tmp/aws-update-linux-instance",

               "/tmp/aws-update-linux-instance --pre-update-script '{{PreUpdateScript}}' --post-update-script '{{PostUpdateScript}}' --include-packages '{{IncludePackages}}' --exclude-packages '{{ExcludePackages}}' 2>amp;1 | tee /tmp/aws-update-linux-instance.log"

           ]

       }

   }

}
  

Как только я выполняю документ из системного менеджера, я подключаюсь по SSH к экземпляру EC2 и пытаюсь, и echo $http_proxy переменная не установлена, показывая, что код не был запущен.

Как я могу запустить bash-код?

Комментарии:

1. рассматривали ли вы возможность создания AMI и использования его вместо этого?

2. после обновления ОС я хочу остановить экземпляр, а затем создать AMI с помощью action: aws:createimage

Ответ №1:

Переменная среды, экспортируемая с помощью команды «экспорт», предназначена только для текущей командной строки. Если вы войдете на хосты через ssh, они будут в другой оболочке, я не думаю, что вы могли видеть переменную env, установленную через ‘runCommand’.

Обходным путем может быть добавление команды в профиль bash. например

echo "export https_proxy=http://myproxy.com:myport" >> ~/.bash_profile