Help us understand the problem. What is going on with this article?

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

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

参考リンク

maru_cc
現職 React + Reduxでウェブ・アプリケーション、Python + DjangoでWebAPI開発してます。 AWSなどインフラからHTML/CSSのフロントまで。 前職 php + Ethna, Symfonyで受託のシステム開発などしてました。
http://maru.cc/
leomo
サイクリスト向けデバイス・サービスを開発・運営するスタートアップ
https://www.leomo.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした