Posted at

TravisCIなどでEC2のSSH元IPを動的に指定する方法

More than 3 years have passed since last update.


やりたいこと

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管理に含める

上記の暗号化した文字列を入れつつ下記ファイルを作る


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 という外部サービスを使って自分自身のIPアドレスを調べる

  • awsコマンドを使って自分自身のIPを Security Group に追加する

  • rsync後に追加した Security Group 設定を削除する


最後に

AWS で不正アクセスされて凄い額の請求が来ていた件

こーいうことがあるから、IAMとか権限とかちゃんとしましょう。


参考リンク