如何使用 Amazon AWS Elastic Beanstalk 部署私有 python pip 依赖项?
Posted
技术标签:
【中文标题】如何使用 Amazon AWS Elastic Beanstalk 部署私有 python pip 依赖项?【英文标题】:How to deploy private python pip dependency with Amazon AWS Elastic Beanstalk? 【发布时间】:2016-04-16 02:39:22 【问题描述】:当我尝试将其中一项服务设置到 AWS Elastic Beanstalk 中时,问题出现了。我们在私有存储库上设置的一个python pip依赖项在部署过程中导致错误,因为它无法访问 用于 pip 进程。下面我介绍我们如何解决这个问题。
值得一提的是,还有其他解决方案可以将部署期间使用的 SSH 密钥绑定到应用程序项目的 git 存储库。我觉得它们有点脏,所以我想分享一个允许将 SSH 密钥分开保存在 S3 存储桶中的一个,与应用程序 git 存储库分开。
【问题讨论】:
虽然总是欢迎问答,但您需要有一个高质量的答案和一个高质量的问题。您的问题是一个松散的单行字,请对其进行一些编辑以符合所需的质量。当一个人努力自我回答然后被否决时,这是一种耻辱。 谢谢,会这样做的 @smentek 是否在应用程序本身(也就是正在安装的那个)上方引用了私有存储库? @AndrewBurnett 私有依赖是指应用程序的库(也是私有的)。应用程序是私有的这一事实从来都不是问题。 @smentek 好的,明白了。我在将 Pyramid 应用程序部署到 EB 时遇到问题。顺便说一句,这是我第一次尝试部署任何类型的应用程序。我遇到的 DistributionNotFound 错误是引用应用程序本身(也就是包含 requirements.txt 的那个)。当我运行 pip freeze 时,会包含对我的应用程序的 git 引用,但如果没有设置 SSH 密钥,AWS 就无法从存储库中提取。我觉得我在这里错过了一些东西。 my 应用程序是如何与所有第三方库一起安装的。我可以/是否需要在 requirements.txt 中包含对它的本地引用? 【参考方案1】:适用于:“运行 Python 3.4 的 64 位 Amazon Linux 2015.09 v2.0.6”,用于依赖来自私有 bitbucket 存储库。可以为github等修改。
将你的私有依赖添加到 pip requirements.txt:
-e git+git@bitbucket.org:account_name/dependency-name.git#egg=dependency-name
生成公共和私人 SSH 密钥(HOWTO 可以在其他地方找到),因此您拥有 id_rsa(私人)和 id_rsa.pub(公共)密钥文件。
在 bitbucket.org 项目选项卡上,找到 settings 并进入“部署密钥”下。 使用表单设置您的公共 SSH 密钥。
上传两个生成的密钥(只需要私有就足够了)在 S3 存储桶上使用亚马逊 AWS 控制台:
bucket-with-keys/bitbucket/:
- id_rsa
- id_rsa.pub
其中 bucket-with-keys/bitbucket - 是 [BUCKET_NAME]/[PATH]。
将包文件添加到您的项目中:project_name/.ebextensions/packages.config
packages:
yum:
git: []
添加配置文件到您的项目:project_name/.ebextensions/03-pip-install-from-bitbucket.config:
files:
"/root/.ssh/config":
owner: root
group: root
mode: "000600"
content: |
Host *
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
"/root/.ssh/known_hosts":
owner: root
group: root
mode: "000644"
content: |
#
# paste output of `ssh-keyscan -H github.com` here
#
commands:
01-command:
command: aws s3 cp --recursive s3://bucket-with-keys/bitbucket/ /root/.ssh
02-command:
command: chmod 600 /root/.ssh/id_rsa
如果您修改此文件,请记住:
命令按字母顺序执行,因此“01-”在“02-”之前开始,即使您要切换其顺序。 文件名也遵循该规则。转到 AWS 控制台 IAM(身份和访问管理)“策略”选项卡并在列表中找到 AmazonS3FullAccess 并将其附加到 aws-elasticbeanstalk-ec2 -角色。 如果您找不到政策,您可以创建一个如下所示的政策:
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
]
如果需要,请查找“Create and Attach Your First Customer Managed Policy”教程。这项政策是相当开放的,建议制定一个更狭窄的政策…… aws-elasticbeanstalk-ec2-role 是 Elastic Beanstalk 默认创建的角色,但您可以使用自己的角色,只要使用 CLI 工具 eb config 在以下位置进行设置:“IamInstanceProfile : aws-elasticbeanstalk-ec2-角色"
现在您可以使用 eb CLI 工具创建您的环境:
eb create project_name-prod-env \
--instance_type t2.micro \
--tier webserver \
--region eu-west-1 \
--cname project_name-prod-env \
--keyname identifier-of-ssh-key-accessed-from-console-here \
--platform "64bit Amazon Linux 2015.09 v2.0.6 running Python 3.4"
现在应该可以工作了!
如果出现问题你可以调试 SSH 文件是否到位:
eb ssh
sudo su
ls -la /root/.ssh/
并在 AWS 控制台或直接在实例上检查日志:
eb ssh
sudo su
less /var/log/eb-activity.log
尝试以 root 用户身份手动执行来自 project_name/.ebextensions/03-pip-install-from-bitbucket.config 的命令,以它们在日志文件中出现的方式显示,使用开关以获得更详细的输出。
【讨论】:
【参考方案2】:我无法发表评论,所以我正在回答这个问题。 smentek的回答很详细,解决了问题。唯一缺少的部分是您需要将 git 包添加到配置中:
packages:
yum:
git-all: ""
files:
"/root/.ssh/config":
# ...
默认情况下,Git 未安装在 Amazon Linux 上。
【讨论】:
谢谢,我已将其添加到我的答案中。以上是关于如何使用 Amazon AWS Elastic Beanstalk 部署私有 python pip 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Elastic Beanstalk 在 Amazon AWS 上为非 Rails ruby 脚本安装 Gems
运行 AWS Deep Learning Base AMI (Amazon Linux 2) 时,如何在 Elastic Beanstalk 中设置 WSGI?
在 Amazon AWS Elastic Beanstalk 环境中存储应用程序
Amazon AWS Elastic Beanstalk - 连接到 mongodb
Amazon Elastic BeanStalk 错误:无法创建 AWS Elastic Beanstalk 应用程序版本