如何将部署程序包从S3转移到EC2实例以运行python脚本?

时间:2020-07-22 09:47:47

标签: amazon-web-services amazon-s3 amazon-ec2 gitlab gitlab-ci

AWS初学者在这里

我在GitLab中有一个回购,其中有一个python脚本和一个requirements.txt文件,并且该python脚本必须部署在EC2 ubuntu实例中(并且该脚本每天必须触发一次) Gitlab CI。我正在使用CI创建存储库的部署程序包,并通过它在S3存储桶中部署压缩程序包。我的.gitlab-ci.yml文件:

image: ubuntu:18.04

variables:
    AWS_DEFAULT_REGION: eu-central-1
    GIT_SUBMODULE_STRATEGY: recursive
    S3_TEST_BUCKET: $BUCKET_UNPACK

stages:
    - deploy 

TestJob:
    stage: deploy
    script:
    - apt-get -y update
    - apt-get -y install python3-pip python3.7 zip
    - python3.7 -m pip install --upgrade pip
    - python3.7 -V
    - pip3.7 install virtualenv
    - mv iso_forest_ad.py ~ # This is the python script
    - mv requirements.txt ~

    # Setup virtual environment
    - mkdir ~/forEC2
    - cd ~/forEC2
    - virtualenv -p python3 venv
    - source venv/bin/activate
    - pip3.7 install -r ~/requirements.txt -t ~/forEC2/venv/lib/python3.7/site-packages/

    # Package environment and dependencies
    - cd ~/forEC2/venv/lib/python3.7/site-packages/
    - zip -r9 ~/forEC2/archive.zip .
    - cd ~
    - zip -g ~/forEC2/archive.zip iso_forest_ad.py

    - pip install awscli --upgrade
    - export PATH=$PATH:~/.local/bin
    - aws configure set aws_access_key_id $AWS_TEST_ACCESS_KEY_ID
    - aws configure set aws_secret_access_key $AWS_TEST_SECRET_ACCESS_KEY
    - aws configure set default.region $AWS_DEFAULT_REGION
    - aws s3 cp ~/forEC2/archive.zip $BUCKET_UNPACK/anomaly-detection-deployment.zip

requirements.txt

的内容
-i https://pypi.org/simple
joblib==0.16.0; python_version >= '3.6'
numpy==1.19.0
pandas==1.0.5
psycopg2-binary==2.8.5
python-dateutil==2.8.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
pytz==2020.1
scikit-learn==0.23.1
scipy==1.5.1; python_version >= '3.6'
six==1.15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
sqlalchemy==1.3.18
threadpoolctl==2.1.0; python_version >= '3.5'

现在,我想传输脚本并将依赖项安装在ubuntu EC2实例中并运行脚本。

我知道一种方法是连接到EC2实例并执行

aws s3 sync s3://s3-bucket-name/folder /home/ubuntu

如帖子中的建议:Moving files from s3 to EC2 instance。但是这样做,我无法从requirements.txt文件安装依赖项。

我想知道是否有替代方法(也许通过使用shell脚本或其他方法?)来实现这一目标。由于我也在本地使用ubuntu,因此不建议使用腻子。

1 个答案:

答案 0 :(得分:1)

您发布的已经显示的link 方法之一。即使用UserData

因此,您将必须开发一个 bash脚本,该脚本不仅下载链接中所示的zip文件,而且还要解压缩该文件,并在侧面安装requirements.txt文件以及您需要的任何其他依赖项或配置设置。

因此您实例的UserData可能是这样的(伪代码,这只是一个粗糙的示例):

#!/bin/bash 

apt update
apt install -y zip awscli python3-pip # awscli is not normally on ubuntu

aws s3 sync s3://optimal-aws-nz-play-config/package.zip .

unzip package.zip

cd package

pip install -r ./requirenements.txt

如果您经常这样做,则可以使用实例设置和UserData创建午餐模板,以针对从模板启动的每个实例自动执行这些步骤。

还有其他可能性,涉及CodeDeployCodePipeline,但是普通的旧UserData是一个好的开始。

替代方法是使用run-command。上传新的s3软件包后,将从gitlab触发命令的执行。

docs中有一个如何调用运行命令的示例:

aws ssm send-command \
    --document-name "AWS-RunPowerShellScript" \
    --parameters commands=["echo helloWorld"] \
    --targets Key=tag:Env,Values=Dev,Test

您必须编写自己的bash命令才能执行,而不是echo helloWorld