AWS Lambda

Lambdaでマネージドプレフィックスリストを使ってS3バケットポリシーのIP制限を自動運用してみた

はじめに

こんにちは、omkです。
AWS Summit Online、面白いセッションがたくさんあって非常に学びになりましたね。

さて、今回はタイトルの通り、S3のバケットポリシーに設定しているIP制限をカスタマーマネージドプレフィックスリストを用いて自動で運用するLambdaを作ったのでご紹介します。
といっても残念なことに、まだマネージドプレフィックスリストのAPIイベントは取得できないみたいなのでイベント駆動で変更をトリガーに自動でキックすることは出来なかったのでEventBridgeのcronで実行します(今後のご対応に期待します)。

開発拠点などの様々な拠点が存在していてVPCのセキュリティグループと合わせての更新と整合性の確認などが面倒なケースがあったので作ってみました。

だいたいこんな感じで拠点IPからのオブジェクトの参照を想定。

Lambda関数

Python3で書いていきます。

import json
import boto3
import os

def lambda_handler(event, context):
    bucket =  os.environ['Bucket']
    prefixlist = os.environ['PrefixListId']
    bucketarn = "arn:aws:s3:::" + bucket

    try:
        ec2client = boto3.client('ec2')
        response = ec2client.get_managed_prefix_list_entries(
            PrefixListId=prefixlist,
            MaxResults=100
        )
    except Exception as e:
        print(e)
        exit

    ips = []

    for entry in response['Entries']:
        ips.append(entry['Cidr'])

    dictpolicy = {
      "Version": "2012-10-17",
      "Id": "VpcSourceIp",
      "Statement": [
          {
              "Sid": "ForManagedPrefixList",
              "Effect": "Allow",
              "Principal": "*",
              "Action": "s3:GetObject",
              "Resource": bucketarn + "/*",
              "Condition": {
                  "IpAddress": {
                      "aws:SourceIp": ips
                  }
              }
          }
      ]
    }

    jsonpolicy = json.dumps(dictpolicy)

    s3client = boto3.client('s3')

    try:
        response = s3client.put_bucket_policy(
          Bucket=bucket,
          Policy=jsonpolicy
        )
    except Exception as e:
        print(e)

Lambda関数には適切なIAMロールが割りあたっている前提で進めます。
バケット名とプレフィックスリストのID(pl-〇〇)を環境変数に入れています。

マネージドプレフィックスリストを参照し、対象となるIP一覧を取得して、バケットポリシーとなるJSONに組み込んでS3バケットを更新します。

という流れになっています。

おわりに

やってみた感想としてLambdaからバケットポリシーを操作するのが結構危なそうな感じがしました(Denyするケースだと特に)。
逆にコードが適切であれば管理も楽になるので上手く活用していきたいですね。

以上、最後までお付き合いありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA