SDKを使用したアプリケーションコードからIAMポリシーを生成するVSCodeプラグイン、iamfastを試してみた

こんにちは。枡川です。
SDKを使用してコードを書いた際に、面倒だからとAdministratorAccess等強めの権限で実行させたりしていることはないですか?
完璧に意図通り動作するならば権限を絞らなくても良いですが、どんな悪用のされ方をするかはわからないので最小権限で動作させることが推奨されます。
しかし、コードが複雑になればなるほど最小権限の設定は面倒な作業となります。
そんな時に便利なVSCodeプラグインであるiamfastを試してみました。
このプラグインはSDKを使用したアプリケーションコードから適切なIAMポリシーを生成してくれるものとなります。
今回はVSCodeプラグインとして使用してみますが、npmパッケージとして公開されているOSSでありCLIで使用することも可能です。

対応している言語は下記となります。

  • JavaScript(v2 SDK)
  • Python3(Boto3 SDK)
  • Go(v1 SDK)
  • Java(v2 SDK)

注意点として、Goのv2 SDKやJavaScriptのv3 SDKはサポートされておりません。

VSCodeで使ってみた

VSCodeのプラグインとしてiamfastが使用できるので検索してインストールします。

テストファイルとしてリポジトリ内に提示されている下記ファイルに対してポリシーを生成してみます。

import boto3
import boto3 as somethingelse
from boto3.session import Session
from boto3 import session as sessionroot

session = Session()
s3 = session.resource('s3')

s3.buckets.all()

s3.create_bucket(Bucket='yourbucket1')

your_bucket = s3.Bucket('yourbucket2')
your_bucket.create()

your_bucket_6 = s3.Bucket('yourbucket3')
your_bucket_6.create(ACL='private').keys()

for s3_file in your_bucket.objects.all():
    print(s3_file.key)

s32 = boto3.resource('s3')

your_bucket2 = s32.Bucket('yourbucket4')
your_bucket2.objects.all()

session2 = boto3.Session()
s33 = session2.client('s3')
s33.list_objects(Bucket='yourbucket5')

実行するには右上のボタンをクリックします。
IAMポリシーが生成されて別タブで立ち上がります。
今回の例では下記ポリシーが生成されました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::yourbucket5",
                "arn:aws:s3:::yourbucket4"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:CreateBucket",
            "Resource": [
                "arn:aws:s3:::yourbucket1",
                "arn:aws:s3:::yourbucket2",
                "arn:aws:s3:::yourbucket3"
            ]
        }
    ]
}

きちんとリソースごとに権限が生成されています。
右クリック > ピーク > 参照をここに表示とクリックすることでコードのどの部分を参照しているかを確認できます。
例えばs3:ListBucketlist_objectsから判断して生成されていることが確認できます。
各SDKのメソッドにはその実行に必要な権限が存在するので、そこから判断してポリシーを生成してくれるようです。

CLIで使ってみた

下記のようにnpmパッケージとしてインストールすることも可能です。

$npm i -g iamfast

CLIで実行する際は下記のように実行します。

$iamfast test.py

--formatオプションでyamlを指定して出力することもできます。(デフォルトはjson)
また、SAMテンプレートを生成することも可能でした。
書いたコードから権限を絞った状態でSAMテンプレートを生成、実行できます。

$iamfast test6.py --format sam
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.9
      CodeUri: .
      MemorySize: 256
      Timeout: 30
      Policies:
        - Version: 2012-10-17
          Statement:
            - Effect: Allow
              Action: s3:ListBucket
              Resource:
                - arn:aws:s3:::yourbucket5
                - arn:aws:s3:::yourbucket4
            - Effect: Allow
              Action: s3:ListAllMyBuckets
              Resource:
                - "*"
            - Effect: Allow
              Action: s3:CreateBucket
              Resource:
                - arn:aws:s3:::yourbucket1
                - arn:aws:s3:::yourbucket2
                - arn:aws:s3:::yourbucket3

最後に

ボタンひとつでIAMポリシーを生成したり、ソースコードからLambda生成用のSAMテンプレートを生成したり、SDKを使用してアプリケーションを作成する時は非常に便利なツールです。
楽にかつ安全に開発を進めるために非常に便利なツールだと思うので、是非試してみて下さい!