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

时间:2016-05-17 05:35:37

标签: amazon-web-services configuration travis-ci continuous-deployment aws-cli

我正在尝试让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网络界面中使用正确的值。

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

3 个答案:

答案 0 :(得分:20)

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运行一个shell脚本,为您创建~/.aws/credentials文件。

<强> 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

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

before_install:
    - ./ecr_credentials.sh

完成!的: - d

来源: Encription keys on Travis CI

答案 1 :(得分:10)

您可以通过多种方式设置这些内容。

首先,在~/.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

在配置cli时,您不需要在这些情况下运行aws configure

this page还有其他AWS文档。

答案 2 :(得分:0)

根据@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

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