はじめに
おはようございます。IWS です
最近、クラウドコスト把握のため、AWS Lambda を使って各アカウントの利用料を取得するというのをしていました。いくつかあるアカウントからデータを取得しようとしていたのですが、それぞれに AWS Lambda を作るというのはしたくなかったのでスイッチロールを使って他所のアカウントのデータを1箇所から取得できるようにしました。今回はそのことについて書いてみようかと思います。
スイッチロール?
簡単に言うと IAM ロールを使って各アカウントの切り替えを簡単にできるようにするものです。
作成した IAM ロールの持っているポリシーの範囲内でスイッチ先のアカウントを操作できます。今回は スイッチ元のアカウント A にある AWS Lambda からスイッチ先の アカウント B で get_cost_and_usage を使ってコストを取得します。
やってみる
まずはスイッチ先のアカウントで IAM ロールを作成します。
IAM ロールの作成の信頼されたエンティティで「AWS アカウント」を選択、下の選択では「別の AWS アカウント」でスイッチ元のアカウント ID を入力します。

これだけです。あとは通常のロール作成時と同じようにポリシーの設定などを行ってください。スイッチ先のアカウントの準備はこれだけです。
AWS Lambda 側準備
使用するのは boto3 の sts_client.assume_role
です
1 2 3 4 5 6 7 8 9 10 |
# スイッチ元のセッション base_session = boto3.Session(region_name="ap-northeast-1") sts_client = base_session.client("sts") # スイッチ先のセッション assumed_role = sts_client.assume_role( RoleArn="<作成した IAM ロールの ARN>", RoleSessionName="AssumeRoleSession", ) |
なんとこれだけです。レスポンスの Credentials
の中にアクセスキーやシークレットキーといった情報が入っているのでこれを使って新しいセッションを発行するだけでスイッチロールができます。
1 2 3 4 5 6 7 8 9 10 |
credentials = assumed_role["Credentials"] assume_role_session = boto3.Session( aws_access_key_id=credentials["AccessKeyId"], aws_secret_access_key=credentials["SecretAccessKey"], aws_session_token=credentials["SessionToken"], ) # スイッチ先アカウントで ce が使える! ce = assume_role_session.client("ce") |
あとは client("ce")
などを使ってポリシーの範囲内で操作ができます。
1 2 3 4 5 6 7 8 9 |
res = ce.get_cost_and_usage( TimePeriod={"Start": start, "End": end}, Granularity="MONTHLY", Metrics=["UnblendedCost"], ) total_amount = float(res["ResultsByTime"][0]["Total"]["UnblendedCost"]["Amount"]) # アカウント B の料金 : 300 USD |
まとめ
別の AWS アカウントを操作できる「スイッチロール」をやってみました。今回はコストを取得してみただけですが、ポリシーを変えれば当然 Amazon ECS を操作したり Amazon Cloudwatch を操作したりもできるため、あるアカウントから別のアカウントに対して簡単に CLI が使えるということだけでも覚えておくといつか役に立つかもしれません。
みなさんもぜひ「スイッチロール」役立ててみてください!