2019. 12. 9
AWS サービスの IP に追従してセキュリティグループを更新する Lambda 関数
この記事は Fusic その 2 Advent Calendar 2019 3 日目の記事です。
はじめに
ある日仕事をしていると、
- インターネットアクセスさせたくない
- 費用面から NAT Gateway は置きたくない
という条件で、EC2 に対して Lambda 関数でエンドポイントを叩く必要が出てきました。
(この辺りの背景に関するツッコミはなしの方向でお願いします)
なので、「Lambda の IP をセキュリティーグループに追加すればいいじゃん」という発想になったので、Lambda(EC2)の IP アドレス範囲をセキュリティグループに設定/更新するための Lambda 関数を作成しました。
と言っても、基本的にはこちらのソースコードを元に、CloudFront 以外のサービスも更新できるように改修を加えただけです。
完成物
https://github.com/k-masatany/auto-ip-groups-update-lambda
SAM を使っているので、ほぼそのままデプロイすることができると思います。
使い方
1. ターゲットのセキュリティグループの作成
更新対象としたいセキュリティグループに、下記のタグを付けます。
Name: autoupdate_target
AutoUpdate: true
Protocol: http(またはhttps)
2. 関数のデプロイ
※ SNS の通知を受け取る都合上、 us-east-1 で構築する必要があります。
デフォルトで EC2 の IP を開放するようになっていますが、環境変数 SERVICE に別の値を入れることで、 CloudFront 等にも対応できるはずです。
- .env.example を参考に .env を作成
- sam package を実行
- sam deploy を実行
3. AmazonIpSpaceChanged イベントを待つ
待ちきれない方は、下記のようなテストイベントを作成して実行すれば更新されると思います。
{
\"Records\": [
{
\"EventVersion\": \"1.0\",
\"EventSubscriptionArn\": \"arn:aws:sns:EXAMPLE\",
\"EventSource\": \"aws:sns\",
\"Sns\": {
\"SignatureVersion\": \"1\",
\"Timestamp\": \"1970-01-01T00:00:00.000Z\",
\"Signature\": \"EXAMPLE\",
\"SigningCertUrl\": \"EXAMPLE\",
\"MessageId\": \"95df01b4-ee98-5cb9-9903-4c221d41eb5e\",
\"Message\": \"{\\\"create-time\\\": \\\"yyyy-mm-ddThh:mm:ss+00:00\\\", \\\"synctoken\\\": \\\"0123456789\\\", \\\"md5\\\": \\\"45be1ba64fe83acb7ef247bccbc45704\\\", \\\"url\\\": \\\"https://ip-ranges.amazonaws.com/ip-ranges.json\\\"}\",
\"Type\": \"Notification\",
\"UnsubscribeUrl\": \"EXAMPLE\",
\"TopicArn\": \"arn:aws:sns:EXAMPLE\",
\"Subject\": \"TestInvoke\"
}
}
]
}
md5
の部分が一致せずにエラーが起きると思うので、エラーメッセージを見ながら修正したら動くと思います。
おわりに
EC2 の IP 範囲を開放したいと言うニーズが少なそうですし、CloudFront の IP 範囲であれば元のソースコードで事足りるので、今回は完全に俺得情報となっています。
もし似たような境遇の方がいて、救いの手になると嬉しいです。