如何使用 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 应用程序版本

Amazon Elastic Beanstalk 如何采用自定义 python 命令?