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

  • 5
    Like
  • 0
    Comment
More than 1 year has 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とか権限とかちゃんとしましょう。

参考リンク