S3作ってそのS3に対する操作権限をもつIAMユーザ作るスクリプト書いてみた

2020.02.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「優れたハッカーとは、ショートカットとなるプログラムを素早く作成し仕事を早くこなす者を指す。」

こんにちは(U・ω・U) AWS事業部の深澤です。

どこで読んだのかは忘れましたが、遠い昔何かで読んだ本でこのような一節があって今でも覚えています。それ以来、出来るだけ同じ作業が発生するようなものはコンピュータにやらせようとしているのですが、今回はそういった中で生まれたものをご紹介しようとこのブログを書きました。作った成果物はこちらにございます。

これを使うとS3を作って、それに対する権限を持ったIAMユーザを発行します。

使い方

以下のように -nで名前を指定して下さい。この名前はバケット名及びIAMユーザ、ポリシー名で使用されます。-pでIAMユーザに付与するポリシーjsonへの相対PATHを指定して下さい。

$ python create_s3_and_issue_iam.py -n cm-fukazawa-sampleple -p base_terraform_policy.json

ポリシーのjsonに入る対象S3バケット名はプログラム側で書くので空欄で大丈夫です。オブジェクトが対象となる場合にはバケットからみた対象へのPATHを記載して下さい。以下に例を書きます。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": ""
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "/*"  ★GetObjectとPutObjectはオブジェクトが対象なので対象へのPATHを記載。今回は*なので全てが対象
}
]
}

作ろうと思ったきっかけ

僕は普段、環境の構築にはTerraformを用いるのですが、TerraformのバックエンドをS3にした場合、このS3はTerraformの管轄には含まれません(手で作った後にimportすればできますが)。いろんな案件でTerraformを使う都度、このバックエンドのS3を手で作ってそれ専用のIAMユーザを発行するのが煩雑になったので作ってみました。 それ以外でもS3を作って、そのS3に対する権限のみ付与したユーザが欲しいってケースはこれまでも何回かあったなぁと思い今回は公開してみようと思いました。

反省

  • 長い。
  • スクリプトだから1ファイルでも良いかって思ったのですが継承とかやるならモジュールとして切り出して別ファイルにしても良かったのかなと思ってます。
  • Regionがハードコード
  • 作成だけじゃなくて削除する機能も付けたいなと思いました
  • エラーハンドリングをしっかりしたい
  • 今回は簡単なスクリプト目的という感じでガリガリ作ってしまったのですが、もっと期待している例外を指定してエラーハンドリングをしっかりすべきだなぁと反省しました。
  • Docker使う感じにすれば良かったです。標準モジュールしか使っていないとはいえ、このプログラムはローカルにpythonを入れなくてはなりません。

最後に

誰かの役にたったら幸いです。このまま使わなくても処理とかコードが参考になってくれたら嬉しいです。 以上、深澤(@shun_quartet)でした!