Amazon VPC での接続だけ RDS に許可 + 任意のIPだけ外部からアクセス一時的に許可したい

Amazon EC2 のセキュリティグループの設定にあたって次の要件を解決したいというものがありました。

  • Amazon VPC に参加するインスタンスなどからだけ、RDS にアクセスを許可したい。
  • 任意の IP だけ、外部アクセスを一時的に許可したい。

これらを実現を試してみました。

参考

前提

作業前段階で次の状態になっている。

  • RDS が作成してある。
  • パブリックアクセスは許可してある
  • default のセキュリティグループ 0.0.0.0/0 が許可されている

VPC の内からのアクセスだけ許可する

以下の作業を行う。

  1. 新しくセキュリティグループを追加(今回は、TEST-SG とします。)
  2. TEST-SG にインバウンドルールを追加
    • タイプ:MYSQL/Aurora
    • プロトコル:TCP
    • ポート範囲:3306
    • ソース:カスタム
          IP 範囲として、 VPC の IPv4 CIDR を記述。
  3. default のセキュリティグループを外す

これで、VPC 内のインスタンスからは、アクセスができるようになりました。

任意の IP だけ外部からアクセスを許可したい。

例えば、Github Actions でデータベースのマイグレーションを行いたいときに任意の IP からだけ VPC 外からアクセスを許可したいというような要件です。
なので、Github Actions で行うことを前提として、用意してみます。

  1. IAM ポリシーを新規に作成する
    • 名前は任意(今回は、my-authorize-revoke-security-group-ingress-iam)
    • 許可するアクション
      • ec2:RevokeSecurityGroupIngress
      • ec2:AuthorizeSecurityGroupIngress
  2. 認証に使用するIAM ユーザーに先に作成したポリシーを付与する

これらができたら、github actions で確認を進めます。
次のワークフローを用意します。

.github/workflows/migration.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
name: Migration 
on:
push:
tags:
- deploy-*

jobs:
build-and-push:

runs-on: ubuntu-18.04
timeout-minutes: 30

steps:
# ソースをチェックアウト <= 今回のターゲットではないが デプロイなどする場合には必要
- uses: actions/checkout@v1

# IAM ユーザーの認証
- name:
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1

# パブリックIP 取得
- name: Get Public IP
id: get-public-ip
run: |
echo "::set-output name=ip::`curl ifconfig.io`"

# セキュリティグループのルールを追加
- name: Security group rule add
id: security-group-rule-add
run: |
aws ec2 authorize-security-group-ingress --group-name TEST-SG --protocol tcp --port 3306 --cidr ${{steps.get-public-ip.outputs.ip}}/32

# このあたりでデータベースを作成、マイグレーションを実行すればいい

# セキュリティグループのルールを削除
- name: Security group rule remove
id: security-group-rule-remove
run: |
aws ec2 revoke-security-group-ingress --group-name TEST-SG --protocol tcp --port 3306 --cidr ${{steps.get-public-ip.outputs.ip}}/32

上記のワークフローを実行(deploy-hogehogeのタグをつける)と動作します。
これを動かすと、IAMユーザーを認証しパブリックIPを取得。
セキュリティーグループのルールを追加し、セキュリティグループのルールを削除します。
実行結果として、完全に終わるとTEST-SGのセキュリティルールは元に戻っています。
本当にIPを許可しているのか見るには、Security group rule remove をコメントアウトなどするとわかりやすいです。

パブリックIPをセキュリティーグループに許可している間にマイグレーション行い、閉じれば良いです。

ではでは。