Amazon web services 如何将部署包从S3传输到EC2实例以运行python脚本?
这里是AWS初学者 我在GitLab中有一个repo,它有一个python脚本和一个Amazon web services 如何将部署包从S3传输到EC2实例以运行python脚本?,amazon-web-services,amazon-s3,amazon-ec2,gitlab,gitlab-ci,Amazon Web Services,Amazon S3,Amazon Ec2,Gitlab,Gitlab Ci,这里是AWS初学者 我在GitLab中有一个repo,它有一个python脚本和一个requirements.txt文件,python脚本必须通过GitLab CI部署在EC2 ubuntu实例中(并且脚本必须每天只触发一次)。我正在使用CI创建一个repo的部署包,通过这个包,我正在S3 bucket中部署压缩包。我的.gitlab ci.yml文件: image: ubuntu:18.04 variables: AWS_DEFAULT_REGION: eu-central-1
requirements.txt
文件,python脚本必须通过GitLab CI部署在EC2 ubuntu实例中(并且脚本必须每天只触发一次)。我正在使用CI创建一个repo的部署包,通过这个包,我正在S3 bucket中部署压缩包。我的.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
正如帖子中所建议的那样:。但是这样做,我无法从requirements.txt
文件安装依赖项
我想知道是否有另一种方法(可能通过使用shell脚本或其他方法)来实现这一点。因为我也在本地使用ubuntu,所以使用putty不是我的选择。你发布的已经显示了一种方法。即通过使用
因此,您必须开发一个bash脚本,该脚本不仅可以下载链接中所示的zip文件,还可以将其解压缩,并安装requirements.txt
文件以及您需要的任何其他依赖项或配置设置
因此,您实例的UserData
如下所示(伪代码,这只是一个粗略的示例):
如果这是您经常做的事情,您可以使用实例设置和UserData
创建午餐模板,以便为从模板启动的每个实例自动执行这些步骤
还有其他的可能性,包括CodeDeploy
,codepippeline
,但是普通的UserData
将是一个好的开始
另一种选择是使用。在上传新的s3包之后,将从gitlab触发该命令的执行
下面是如何调用run命令的示例:
您需要编写自己的bash命令来执行,而不是echo helloWorld
。嘿,@Marcin,谢谢您的回复。我了解到,创建实例时,UserData
只运行一次。如果是,考虑到我对脚本进行了更改并且希望部署这些更改的情况,在这种情况下会发生什么?@reinhardt Hi。遗憾的是,什么都没有。UserData只运行一次。如果您希望在每次进行更改时部署脚本,可以使用CodePipeline,如答案中所述。你也可以使用更容易使用的。基本上,在gitlab.yml中,可以使用aws cli在实例上执行run命令。该命令将运行与userdata基本相同的脚本。感谢您的建议。如果可能,您可以添加一个使用run命令的小示例吗?@reinhardt example added:-)
#!/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
aws ssm send-command \
--document-name "AWS-RunPowerShellScript" \
--parameters commands=["echo helloWorld"] \
--targets Key=tag:Env,Values=Dev,Test