запуск скрипта для загрузки файла в AWS S3 работает, но запуск того же скрипта через jenkins job не работает

#amazon-web-services #docker #jenkins #amazon-s3 #ssh

#amazon-web-services #docker #дженкинс #amazon-s3 #ssh

Вопрос:

Простая цель:

Я хотел бы, чтобы на моем локальном компьютере были запущены два контейнера. Один jenkins контейнер и один SSH server контейнер. Затем jenkins job может подключиться к контейнеру SSH-сервера и выполнить команду aws для загрузки файла в S3.

Структура каталогов моего рабочего пространства:

  • a docker-compose.yml (подробности см. Ниже)
  • каталог с именем centos/ ,
  • Внутри centos/ у меня есть Dockerfile для создания образа SSH-сервера.

Docker-compose.yml:

В моем docker-compose.yml я объявил два контейнера (службы).

  • Один контейнер jenkins, имя jenkins .
  • Один SSH-сервер contaienr, названный remote_host .
 version: '3'
services:
  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    ports:
      - "8080:8080"
    volumes:
      - $PWD/jenkins_home:/var/jenkins_home
    networks:
      - net

  remote_host:
    container_name: remote_host
    image: remote-host
    build: 
      context: centos7
    networks:
      - net
networks:
  net:
  

Dockerfile Для remote_host этого это так (обратите внимание, что последний RUN устанавливает интерфейс командной строки AWS):

 FROM centos

RUN yum -y install openssh-server

RUN useradd remote_user amp;amp; 
    echo remote_user:1234 | chpasswd amp;amp; 
    mkdir /home/remote_user/.ssh amp;amp; 
    chmod 700 /home/remote_user/.ssh

COPY remote-key.pub /home/remote_user/.ssh/authorized_keys

RUN chown remote_user:remote_user -R /home/remote_user/.ssh/ amp;amp; 
    chmod 600 /home/remote_user/.ssh/authorized_keys

RUN ssh-keygen -A
RUN rm -rf /run/nologin

RUN yum -y install unzip

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" amp;amp; unzip awscliv2.zip amp;amp; ./aws/install

  

Текущая ситуация с вышеуказанной настройкой:

Я запускаю docker-compose build и docker-compose up . Оба jenkins контейнера и контейнер remote_host (SSH server) успешно запущены.

Я могу зайти внутрь jenkins контейнера с помощью :

 $ docker exec -it jenkins bash
jenkins@7551f2fa441d:/$ 
  

Я могу успешно подключиться к контейнеру с помощью remote_host :

 jenkins@7551f2fa441d:/$ ssh -i /tmp/remote-key remote_user@remote_host
Warning: the ECDSA host key for 'remote_host' differs from the key for the IP address '172.19.0.2'
Offending key for IP in /var/jenkins_home/.ssh/known_hosts:1
Matching host key in /var/jenkins_home/.ssh/known_hosts:2
Are you sure you want to continue connecting (yes/no)? yes
[remote_user@8c203bbdcf72 ~]$ 
  

Внутри remote_host контейнера я также настроил свой ключ доступа AWS и секретный ключ в ~.aws/credentials :

 [default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  

Я могу успешно запустить команду aws для загрузки файла из remote_host контейнера в мою корзину AWS S3. Нравится:

 [remote_user@8c203bbdcf72 ~]$ aws s3 cp myfile s3://mybucket123asx/myfile
  

В чем проблема

Теперь я хотел бы, чтобы мое задание jenkins выполнило команду aws для загрузки файла в S3. Итак, я создал сценарий оболочки внутри своего remote_host контейнера, сценарий выглядит следующим образом:

 #/bin/bash
BUCKET_NAME=$1
aws s3 cp /tmp/myfile s3://$BUCKET_NAME/myfile
  

В моем jenkins я настроил SSH, а в конфигурации задания jenkins у меня есть:

введите описание изображения здесь

Как вы можете видеть, он просто запускает скрипт, расположенный в remote_host контейнере.

Когда я создаю задание Дженкинса, я всегда получаю сообщение об ошибке в консоли : upload failed: ../../tmp/myfile to s3://mybucket123asx/myfile Unable to locate credentials .

Почему одна и та же команда s3 работает при выполнении в remote_host контейнере, но не работает при запуске из задания jenkins?

Я также попытался явно экспортировать идентификатор ключа aws и секретный ключ в скрипте. (имейте в виду, что у меня ~.aws/credentils настроен in remote_host , который работает без явного экспорта секретного ключа aws)

 #/bin/bash
BUCKET_NAME=$1
export aws_access_key_id=AKAARXL1CFQNN4UV5TIO
export aws_secret_access_key=MY_SECRETE_KEY
aws s3 cp /tmp/myfile s3://$BUCKET_NAME/myfile
  

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

1. В последнем примере экспорт должен быть выполнен заглавными буквами, как показано здесь .

2. Для Дженкинса возможно, что скрипты не запускают remote_user user. В вашем скрипте вы можете добавить whoami и подтвердить пользователя, который выполняет скрипт?

3. Скорее всего, проблема пользователя, как упоминал Марчин. Кстати, в ваших скриптах отсутствует восклицательный знак в верхней строке: он должен быть #!/bin/bash . Это, конечно, не корень проблемы с загрузкой.

4. Я попробовал предложение @Marcin, whoami показывает, что Дженкинс запускает скрипт как remote_user

Ответ №1:

Хорошо, я решил свою проблему, изменив export оператор на прописной. Итак, причина проблемы в том, что когда Дженкинс запускает скрипт, он запускается как remote_user вкл remote_host . Хотя у remote_host меня есть ~/.aws/credentials настройка, но у этого файла есть разрешение на чтение только для пользователей, отличных от root :

 [root@8c203bbdcf72 /]# ls -l ~/.aws/
total 4
-rw-r--r-- 1 root root 112 Sep 25 19:14 credentials
  

Вот почему, когда Дженкинс запускал скрипт для загрузки файла в S3 Unable to locate credentials , произошел сбой. Потому что файл учетных данных не может быть прочитан remote_user . Итак, мне все равно нужно раскомментировать строки, которые экспортируют идентификатор ключа aws и секретный ключ. Комментарий @Marcin полезен тем, что буквы должны быть заглавными, иначе это не сработало бы.

Итак, в целом, что я сделал для устранения проблемы, так это обновил мой скрипт с помощью:

 export aws_access_key_id=AKAARXL1CFQNN4UV5TIO
export aws_secret_access_key=MY_SECRETE_KEY