🐧
IAM関連でよく使う処理をまとめてみた(Python)
はじめに
こんにちは、クラスメソッド AWS事業本部の筧です。
最近、AWSアカウントの初期設定を Lambda で実施する機会がありました。今回は IAM 関連の処理についてブログ向けに汎化してご紹介します。各設定値はサンプルですので、ご利用の環境に合わせて変更ください。
テンプレート
IAM 関連の処理をまとめたプログラムが以下になります。IAMService
クラスを呼び出して、必要な設定を実施ください。
以下は抜粋です。
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
します。
$ 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