如何在 travis 部署脚本中 运行 aws configure?
How to run aws configure in a travis deploy script?
我正在尝试让 travis-ci to run a custom deploy script that uses 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
运行时,它会停止并等待用户输入。如何让它使用我定义的环境变量?
您可以通过多种方式进行设置。
首先,在 ~/.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 文档。
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
然后您只需要 运行 您的 .travis.yml
文件中的 ecr_credentials.sh
脚本:
before_install:
- ./ecr_credentials.sh
完成! :-D
根据@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-ci to run a custom deploy script that uses 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
运行时,它会停止并等待用户输入。如何让它使用我定义的环境变量?
您可以通过多种方式进行设置。
首先,在 ~/.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 文档。
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
然后您只需要 运行 您的 .travis.yml
文件中的 ecr_credentials.sh
脚本:
before_install:
- ./ecr_credentials.sh
完成! :-D
根据@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。