CircleCIからEC2上に構築しているサーバにデプロイする方法です
前提
- ローカルなどからcapistranoでデプロイできる状態
準備
セキュリティグループ
SSHをセキュリティグループで制限している場合、CircleCI上からのアクセスを許可しなくてはなりません
VPC
VPCでは他セキュリティグループからの許可ができません
CircleCIはEC2 US East region上に構築されているのでそのIPを全部許可すればよいのですが現実的ではありません(よね?)
AWS CLIを使ってビルドの開始時にコンテナのIPをSSH許可して、終了時にSSH許可を取り消す事で対応します
SSH許可
aws ec2 authorize-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
SSH許可を取り消し
aws ec2 revoke-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
VPC以外
VPC環境で構築していない場合は、CircleCIのセキュリティグループのIDが公開されていますのでAWSで別のアカウントのセキュリティグループを使うを参考にしてアクセスを許可してください
秘密鍵の設定
EC2にログインする為の秘密鍵を設定してください
Project Settings
-> SSH keys
から設定できます
設定した秘密鍵はビルド時に自動的にssh-agent
に追加されます
またGitHubへのアクセスもssh-agent
を利用している場合はGitHubへアクセスできる秘密鍵も設定してください
AWS CLI
CircleCI上にインストールされているAWS CLI
はバージョンが古い為、以下のエラーが出てしまいます
--group-id: mispelled meta parameter?
dependencies
で最新版をインストールする事で回避できます
dependencies:
pre:
- sudo pip install awscli
環境変数
AWSにアクセスする為に必要な環境変数を設定してください
-
AWS_ACCESS_KEY_ID
- アクセスキーID -
AWS_SECRET_ACCESS_KEY
- 秘密アクセスキー
環境変数はProject Settings
-> Environment vairables
で設定できます
サンプル
circle.yml
masterにpush時にstagingにデプロイするサンプルです
machine:
ruby:
version:
2.1.2
dependencies:
pre:
- sudo pip install awscli
test:
override:
- bundle exec rake rubocop
- bundle exec rake spec
deployment:
staging:
branch: master
commands:
- sh script/deploy_staging.sh
script/deploy_staging.sh
#!/bin/sh
export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
export AWS_DEFAULT_REGION="ap-northeast-1"
MYSECURITYGROUP=”セキュリティグループID"
MYIP=`curl -s ifconfig.me`
aws ec2 authorize-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
bundle exec cap staging deploy
aws ec2 revoke-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
Links
- Circle's EC2 IP addresses and AWS security group
- [AWS][CLI] EC2にSSHするときだけ、security groupに自分のアドレスを追加する
- What Is the AWS Command Line Interface?
以上