33
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-17

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サイトを自動デプロイ

33
21
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
33
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?