LoginSignup
7
6

More than 5 years have passed since last update.

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

Posted at

やりたいこと

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とか権限とかちゃんとしましょう。

参考リンク

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6