🐧

IAM関連でよく使う処理をまとめてみた(Python)

2022/01/24に公開

はじめに

こんにちは、クラスメソッド AWS事業本部の筧です。

最近、AWSアカウントの初期設定を Lambda で実施する機会がありました。今回は IAM 関連の処理についてブログ向けに汎化してご紹介します。各設定値はサンプルですので、ご利用の環境に合わせて変更ください。

テンプレート

IAM 関連の処理をまとめたプログラムが以下になります。IAMServiceクラスを呼び出して、必要な設定を実施ください。

https://github.com/takaakikakei/sls-services-snippet/blob/main/src/services/iam.py

以下は抜粋です。

src/services/iam.py(抜粋)
import logging
from typing import Dict, List

import boto3.session
from botocore.config import Config
from mypy_boto3_iam.client import IAMClient

logger = logging.getLogger()
logger.setLevel(logging.INFO)


class IAMService:
    def __init__(self):
        self.session = boto3.session.Session()
        self.client: IAMClient = self.session.client("iam", config=Config())

    def create_role(self, role_name: str, assume_role_policy_document: str) -> bool:
        """
        ロール作成。信頼関係のポリシードキュメントもあわせて設定。
        refs: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/iam.html#IAM.Client.create_role
        """
        try:
            self.client.create_role(
                RoleName=role_name,
                AssumeRolePolicyDocument=assume_role_policy_document,
            )
            return True
        except Exception as e:
            if e.response["Error"]["Code"] == "EntityAlreadyExists":
                return True
            else:
                logger.error(e)
                return False

    def waiter_role_exist(self, role_name: str) -> None:
        """
        refs: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/iam.html#IAM.Client.get_waiter
        """
        waiter = self.client.get_waiter("role_exists")
        waiter.wait(RoleName=role_name)

    def attach_role_policy(self, role_name: str, policy_arn: str) -> bool:
        """
        AWS管理ポリシーの付与
        refs: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/iam.html#IAM.Client.attach_role_policy
        """
        try:
            self.client.attach_role_policy(RoleName=role_name, PolicyArn=policy_arn)
            return True
        except Exception as e:
            logger.error(e)
            return False

使ってみる

実際に上記クラスを呼び出す処理( setup_iam )を作成したので使ってみます。設定内容は以下です。動作確認がメインで設定内容は適当です。

  • 新規 IAM ロール( test_role )作成
  • IAMロール作成と同時に信頼関係のポリシードキュメントも設定
  • 作成したIAMロールに AWS 管理ポリシーの ReadOnlyAccess を付与
  • 作成したIAMロールに インラインポリシーの ViewBillingPolicy を付与

前提

端末にインストールが必要なもの

  • serverless framework
  • npm
  • pipenv

準備

リポジトリを git clone します。

https://github.com/takaakikakei/sls-services-snippet

$ git clone git@github.com:takaakikakei/sls-services-snippet.git

サービスのディレクトリに移動して、パッケージとライブラリをインストールします。

$ cd sls-services-snippet
$ npm ci
$ pipenv install

サービスをデプロイします。

$ sls deploy --stage dev

実行

ローカルでサービスを動かします。

$ pipenv shell
$ sls invoke local -f setup_iam --stage dev

無事、IAM ロールが作成されました。


削除

Serverless Framework でデプロイしたサービスを削除します。

$ sls remove --stage dev

IAM ロール( test_role )は手動で削除ください。

あとがき

最後まで読んでいただきありがとうございます。
IAM以外のサービスについても今後スニペットを紹介予定なのでお楽しみに。
それではまた!

Discussion