目次
はじめに
こんにちは、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するケースだと特に)。
逆にコードが適切であれば管理も楽になるので上手く活用していきたいですね。
以上、最後までお付き合いありがとうございました。
![omk](https://blog.denet.co.jp/wp-content/uploads/2021/06/ume02.png)
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!