1. maru_cc

    Posted

    maru_cc
Changes in title
+TravisCIなどでEC2のSSH元IPを動的に指定する方法
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,113 @@
+
+## やりたいこと
+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で特定セキュリティグループの設定の追加削除が出来るようにする設定](http://qiita.com/kawaz/items/a86370c9908367bcb509)
+
+### 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管理に含める
+上記の暗号化した文字列を入れつつ下記ファイルを作る
+
+```.travis.yml
+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](http://ifconfig.me) という外部サービスを使って自分自身のIPアドレスを調べる
+* awsコマンドを使って自分自身のIPを Security Group に追加する
+* rsync後に追加した Security Group 設定を削除する
+
+
+## 最後に
+
+[AWS で不正アクセスされて凄い額の請求が来ていた件](http://d.hatena.ne.jp/yoya/20150404/aws)
+こーいうことがあるから、IAMとか権限とかちゃんとしましょう。
+
+## 参考リンク
+
+* [【TravisCI】travis.ymlに書くあれこれ](http://qiita.com/oh_rusty_nail/items/157241b6cb5a304462fe)
+* [TravisCIでファイルを(簡単に)暗号化して使用する](http://qiita.com/kmats@github/items/d22fd856883e6c16d7ea)
+* [[AWS][CLI] EC2にSSHするときだけ、security groupに自分のアドレスを追加する](http://dev.classmethod.jp/etc/ssh_with_adding_ingress_rule/)
+