如何在 travis 部署脚本中运行 aws configure?

Posted

技术标签:

【中文标题】如何在 travis 部署脚本中运行 aws configure?【英文标题】:How to run aws configure in a travis deploy script? 【发布时间】:2016-09-13 01:39:39 【问题描述】:

我正在尝试让 travis-ci 运行自定义部署脚本,该脚本使用 awscli 将部署推送到我的登台服务器。

在我的.travis.yml 文件中,我有这个:

before_deploy:
  - 'curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"'
  - 'unzip awscli-bundle.zip'
  - './awscli-bundle/install -b ~/bin/aws'
  - 'export PATH=~/bin:$PATH'
  - 'aws configure'

并且我已经设置了以下环境变量:

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_DEFAULT_REGION

travis-ci Web 界面中显示正确的值。

但是,当aws configure 运行时,它会停止并等待用户输入。如何告诉它使用我定义的环境变量?

【问题讨论】:

在尝试在 Travis 上安装 awscli 时发现了这个问题——最终我得到的是使用 pip install --user awscli 而不是上面的 before_deploy 节。 如果您运行aws configure set help,您将看到您可以在命令行上单独提供设置,它们将被写入相关凭据或配置文件。 【参考方案1】:

您可以通过多种方式进行设置。

首先,通过在~/.aws/config(或~/.aws/credentials)创建一个文件。

例如:

[default]
aws_access_key_id=foo
aws_secret_access_key=bar
region=us-west-2

其次,您可以为每个设置添加环境变量。

例如,创建以下环境变量:

AWS_DEFAULT_REGION
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY

第三,您可以将区域作为命令行参数传入。例如:

aws eb deploy --region us-west-2

在这些情况下,您无需运行 aws configure,因为已配置 cli。

this page 上还有更多 AWS 文档。

【讨论】:

不确定我是否有能力在 Travis 上创建 ~/.aws/credentials 文件。另一种方法是只保留环境变量设置并删除aws configure 行。【参考方案2】:

Darbio 的解决方案运行良好,但没有考虑到您最终可能会将 AWS 凭证推送到存储库中。

这是一件坏事,尤其是当 docker 试图从您的 ECR 存储库中提取私有映像时。这意味着您可能不得不将 AWS 生产凭证存储在 .travis.yml 文件中,这远非理想。

幸运的是,Travis 让您可以加密环境变量、通知设置和部署 api 密钥。

gem install travis

首先做一个travis login,它会要求你提供你的github凭据。登录后进入项目根文件夹(.travis.yml 文件所在的位置)并加密您的访问密钥 ID 和秘密访问密钥。

travis encrypt AWS_ACCESS_KEY_ID="HERE_PUT_YOUR_ACCESS_KEY_ID" --add
travis encrypt AWS_SECRET_ACCESS_KEY="HERE_PUT_YOUR_SECRET_ACCESS_KEY" --add

感谢--add 选项,您最终会在配置文件中获得两个新的(加密的)环境变量。现在只需打开您的 .travis.yml 文件,您应该会看到如下内容:

env:
    global:
        - secure: encrypted_stuff
        - secure: encrypted_stuff

现在您可以让 travis 运行一个为您创建 ~/.aws/credentials 文件的 shell 脚本。

ecr_credentials.sh

#!/usr/bin/env bash

mkdir -p ~/.aws

cat > ~/.aws/credentials << EOL
[default]
aws_access_key_id = $AWS_ACCESS_KEY_ID
aws_secret_access_key = $AWS_SECRET_ACCESS_KEY
EOL

然后你只需要从你的.travis.yml 文件中运行ecr_credentials.sh 脚本:

before_install:
    - ./ecr_credentials.sh

完成! :-D

来源: Encription keys on Travis CI

【讨论】:

这非常棒,对我帮助很大,谢谢。不过,我应该注意,创建~/.aws/credentials 文件实际上并不是必需的。只需使用环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 就足以让 aws CLI 工作。 如果您的 repo 是公开的,您仍然会向每个人提供您的密钥,因为任何人都可以为您的 .travis.yml 文件获取值并使用它们将内容部署到您的 AWS 帐户。无论是否加密,我都会在 travis UI 中创建变量,然后仍然使用上面的脚本来创建凭据文件。 引用 Travis 文档:These encrypted values can be added by anyone, but are only readable by Travis CI. The repository owner does not keep any secret key material. Please note that encrypted environment variables are not available for pull requests from forks.。如果您在公共回购中执行此操作,请注意您正在合并的 PR,并且不要授予任何人生成调试版本的权限,您应该没问题(只要您不 echo 变量构建中的内容)。见第一段docs.travis-ci.com/user/encryption-keys 太棒了!谢谢,Francesco——这正是我所需要的。我知道 travis encrypt 命令创建加密的秘密,但无法让它们作为构建的一部分被读取。你是救生员!【参考方案3】:

根据@Darbio 的建议,我想出了这个解决方案:

- stage: deploy
  name: "Deploy to AWS EKS"
  language: minimal
  before_install:
    # Install kubectl
    - curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
    - chmod +x ./kubectl
    - sudo mv ./kubectl /usr/local/bin/kubectl
    # Install AWS CLI
    - if ! [ -x "$(command -v aws)" ]; then curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" ; unzip awscliv2.zip ; sudo ./aws/install ; fi
    # export environment variables for AWS CLI (using Travis environment variables)
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - export AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION
    # Setup kubectl config to use the desired AWS EKS cluster
    - aws eks update-kubeconfig --region $AWS_DEFAULT_REGION --name $AWS_EKS_CLUSTER_NAME

  deploy:
    - provider: script
      # bash script containing the kubectl commands to setup the cluster
      script: bash k8s-config/deployment.sh
      on:
        branch: master

也可以完全避免安装 AWS CLI。然后需要配置kubectl:

kubectl config set-cluster --server= --certificate-authority=
kubectl config set-credentials --client-certificate= --client-key=
kubectl config set-context myContext --cluster= --namespace= --user=
kubectl config use-context myContext

在本地计算机上执行aws eks update-kubeconfig 命令后,您可以在/.kube/config 的用户主目录中找到大部分所需的值。 客户端证书和密钥除外。我不知道从哪里获取它们,因此还需要在管道中安装 AWS CLI。

【讨论】:

以上是关于如何在 travis 部署脚本中运行 aws configure?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用aws elasticbeanstalk中的钩子运行部署后脚本?

向 .travis.yml 文件添加更多配置后,TravisCI 没有运行

使用 Travis、AWS Elasticbeanstalk 和 Docker 构建失败

如何使用 AWS Lambda 脚本通过 Terraform 部署 AWS 基础设施

如何使用 AWS Elastic Beanstalk 在 URL 中运行带有参数的 PHP 脚本?

如何在 Travis CI 中为 C++ 项目并行运行多个构建,每个构建都有单独的脚本?