やりたいこと
github への push をトリガーにEC2環境へファイルを rsync する。
アイデア1
- EC2環境に git をインストールして、Httpでアクセスされると git pull をするようなスクリプトを仕込み、github の Webhook で叩くようにする
アイデア2
- TravisCI などCI環境を使い、rsync で配布する
今回は、アイデア2を採用することにした。
TravisCIを別件で使っていたのと、今後、ansibleで環境構築などを考えていたので、動的にSSHのアクセス権を設定するテストケースにした。
ちなみに、このEC2環境は一時的なテスト環境なので、永続的な本番環境ではない。
環境
- TravisCI 有料版
- EC2
- ElasticIP で固定IP割り当て済み
やったこと
方針を決める
- TravisCIの環境から SSH over rsync が出来るようにIPを動的に通すようにする。
- IPは securty group を実行時に変更する
- IAMで必要な権限を付与した
1.EC2に Securty Group を設定する
設定した Securty Group の Group ID をメモ。
例: GroupID sg-aabbccdd
2.IAM Policy を作る
こちらの記事を参考に Security Group の設定変更が出来る Policy を作る。
IAMで特定セキュリティグループの設定の追加削除が出来るようにする設定
3.IAM User を作る
IAM で User を作る
2で着くた Policy のみを割り当てておく。
Access Key、Secret KEY をメモ。
4.TravisCI の設定ファイルを作る
git のプロジェクトルートで下記コマンドを実行して必要な値を暗号化する
SSHでアクセスするために、EC2に登録した公開鍵をエンコードして含めるようにする
travis encrypt AWS_ACCESS_KEY_ID=AAAA
travis encrypt AWS_SECRET_ACCESS_KEY=BBBB
travis encrypt-file --pro /path/to/key.pem
key.pem.enc というファイルが出来るのでそれを Git管理に含める
上記の暗号化した文字列を入れつつ下記ファイルを作る
language: python
python:
- "2.7"
branches:
only:
- master
addons:
ssh_known_hosts:
- 10.0.0.1 #EC2 IP
env:
global:
- AWS_DEFAULT_REGION=ap-northeast-1
- SECURITYGROUP=sg-aabbccdd
- EC2_IP=10.0.0.1 #EC2 IP
- secure: "XXXX" #AWS_ACCESS_KEY_ID
- secure: "XXXX" #AWS_SECRET_ACCESS_KEY
before_install:
- eval `ssh-agent -s`
- chmod 600 ~/.ssh/config
- openssl aes-256-cbc -K $encrypted_XXXX_key -iv $encrypted_XXXX_iv -in key.pem.enc -out key.pem -d
- mv key.pem ~/.ssh/
- chmod 600 ~/.ssh/key.pem
- ssh-add ~/.ssh/key.pem
install:
- "pip install awscli"
before_script:
- export TRAVIS_IP=`curl -s ifconfig.me` && echo $TRAVIS_IP
- aws ec2 authorize-security-group-ingress --group-id $SECURITYGROUP --protocol tcp --port 22 --cidr $TRAVIS_IP/32
script:
- rsync -arvce "ssh -o StrictHostKeyChecking=no" --exclude='.*' --exclude='key.pem.enc' ./ USER@$EC2_IP:~/path/to/
after_script:
- aws ec2 revoke-security-group-ingress --group-id $SECURITYGROUP --protocol tcp --port 22 --cidr $TRAVIS_IP/32
- ec2コマンドを使うために python 環境にする
- masterブランチだけで動くようにしてある
- エンコードした key.pemファイルをデコードして Travisの実行環境の .ssh以下に移動し、ssh-addコマンドで追加する
- ifconfig.me という外部サービスを使って自分自身のIPアドレスを調べる
- awsコマンドを使って自分自身のIPを Security Group に追加する
- rsync後に追加した Security Group 設定を削除する
最後に
AWS で不正アクセスされて凄い額の請求が来ていた件
こーいうことがあるから、IAMとか権限とかちゃんとしましょう。