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

CircleCI2.0からEC2にアクセスするときだけ特定のIPを許可したい

More than 1 year has passed since last update.

Yper株式会社 でエンジニアをやっています。
個人情報とかも扱うのでセキュリティを固めていて、CircleCIのお便利さとバッティングしたときのメモです。

やりたいこと

EC2にCircleCIからSSHしてなんかしらやりたい、っていうことありませんか?
適当にcapistranoサーバ叩いてデプロイしたいとか、なんかありませんかね。
私は結構あります。

スクリーンショット 2018-12-17 13.37.07.png

ところがどっこい、大体の場合は22番ポートを無制限で許可したりはしていない。
踏み台サーバからだけとか、オフィスのIPじゃないとだめとか、そんなセキュリティグループを設定してなんかいい感じでホワイトリスト作りますよね。

ですがCircleCIはジョブを起動するたびにIPアドレスが変わるわけで、こんな感じになるわけですよ。
スクリーンショット 2018-12-17 13.44.24.png

というわけで、CircleCIのスクリプトの中に動的にアクセス元IPを許可するような処理を書いてあげるといい感じでいろんな作業が捗るようになります。

CircleCI用のIAMとかをごねごね

何でもかんでもEC2FullAccessとかしてませんよね?
ちゃんとセキュリティグループを変更するためだけのポリシーを作っておきましょう。
とりあえず全部許可ダメ絶対。

IAMのところに飛んで
スクリーンショット_2018-12-17_14_08_11.png

ポリシーの作成に進んで
スクリーンショット_2018-12-17_14_11_19.png

ポリシーをJSONで入力しよう
スクリーンショット_2018-12-17_14_08_40.png

はいコピペ用


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupIngress"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:*:*:security-group/*"
        }
    ]
}

適当に名前とか入れて登録
スクリーンショット_2018-12-17_14_09_00.png

ユーザ名を適当につけて
スクリーンショット_2018-12-17_14_19_03.png

さっき作ったポリシーをアタッチして
スクリーンショット_2018-12-17_14_19_46.png

タグはとりあえず空
スクリーンショット_2018-12-17_14_19_54.png

ユーザの作成をポチッと
スクリーンショット_2018-12-17_14_20_21.png

なくさないようにメモるかCSVをダウンロードしておきます
スクリーンショット_2018-12-17_14_20_35.png

CircleCIの設定画面でアクセスキーを環境変数に入れておく

config.ymlに直接書いたりしたらダメだ。絶対にだ。

対象のプロジェクトの設定画面へ行く
スクリーンショット_2018-12-17_14_28_15.png

環境変数の設定を開く
スクリーンショット_2018-12-17_14_26_44.png

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY をNameに設定して、先ほど作成したユーザの情報をそれぞれ登録しておく
スクリーンショット_2018-12-17_14_27_10.png

CircleCIのconfig.ymlを書いてみる

わざと1行ずつ書いてみるとこんな感じ

config.yml
version: 2
jobs:
  deploy:
    docker:
      - image: circleci/python:3.6-jessie
      - image: buildpack-deps:trusty
    working_directory: ~/
    steps:
      - run: sudo pip install awscli
      - run:
          name: "authorize-security-group-ingress"
          command: |
            IP=`curl -s ifconfig.me`
            echo "#!/bin/bash" > ./sg.sh
            echo "aws configure set region ap-northeast-1" >> ./sg.sh
            echo "aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxxxxxxxx --protocol tcp --port 22 --cidr ${IP}/32" >> ./sg.sh
            bash ./sg.sh
      - add_ssh_keys:
          fingerprints:
            - "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
      - run:
          name: deploy
          command: ssh -oStrictHostKeyChecking=no circleci@xxx.xxx.xxx.xxx "bash /home/circleci/script/deploy.sh"
      - run:
          name: "revoke-security-group-ingress"
          command: |
            IP=`curl -s ifconfig.me`
            echo "#!/bin/bash" > ./sg.sh
            echo "aws configure set region ap-northeast-1" >> ./sg.sh
            echo "aws ec2 revoke-security-group-ingress --group-id sg-xxxxxxxxxxxxxx --protocol tcp --port 22 --cidr ${IP}/32" >> ./sg.sh
            bash ./sg.sh

workflows:
  version: 2
  test:
    jobs:
      - deploy:

aws-cliのコンテナとかも用意はされていたものの、何故かコケることが多かったので結局 pip install で入れてます。

aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxxxxxxxx --protocol tcp --port 22 --cidr ${IP}/32
この部分の sg-xxxxxxxxxxxxxx はアクセスしたいEC2インスタンスに紐付いてるセキュリティグループのIDを入れてやってください。

イメージ的にはこんな流れ
スクリーンショット 2018-12-17 15.02.11.png
ただし デプロイ中にジョブが落ちるとセキュリティグループの閉め忘れが発生する のでそこらへんは色々やって監視してあげてる必要があります。

aws-cliは環境変数にアクセス用の情報を入れておくと勝手に読んでくれるので楽ですね。
(参考:AWS CLI 環境変数チートシート)

SSH用の設定のフィンガープリント云々とか、特定のブランチにプッシュしたら云々、とかは↓の記事がわかりやすかったのでおすすめです。
ホストも環境変数入れとけよ!とかは突っ込まないでください。すいません。
Circle CIでwebサイトを自動デプロイ

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
ユーザーは見つかりませんでした