k-masatany.com

  • About
  • Blog
  • Contact
  • About
  • Blog
  • Contact

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 等にも対応できるはずです。

  1. .env.example を参考に .env を作成
  2. sam package を実行
  3. 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 範囲であれば元のソースコードで事足りるので、今回は完全に俺得情報となっています。
もし似たような境遇の方がいて、救いの手になると嬉しいです。

プロフィールアイコン
k-masatany k-masatany's memorandum
このエントリーをTwitterで共有 このエントリーをLINEで共有 このエントリーをはてなブックマークに追加

Table of Contents

  • はじめに
  • 完成物
  • 使い方
    • 1. ターゲットのセキュリティグループの作成
    • 2. 関数のデプロイ
    • 3. AmazonIpSpaceChanged イベントを待つ
  • おわりに

© 2021 k-masatany