概要
こんにちは、キュービックでSREをやっているYuhta28です。キュービック内のテック技術について発信します。
弊社ではAWSを使ってWebメディア運営、及びプロダクト開発を実施しております。
当初は一つのAWSアカウント内ですべての環境を管理してその中でIAMによる権限管理を実施しようと考えましたが、管理工数が大変で手作業によるミスがあると全体への影響度が大きいことから複数のAWSアカウントを使って管理・運用しようという話になりました。
この考え方は先日DeNAさんが開催したDeNA TechCon 20221でも述べられており、以下のセッション内容が非常に参考なりましたのでセッション内資料を基にマルチアカウント運用とシングルアカウント運用の対比について図示してみました。(スライドページも公開されていますので、合わせてご参照ください。)
パブリッククラウドアカウントの DeNA 的管理手法(全体編) | DeNA TechCon2022
アカウント管理図
アカウント粒度 | アカウント数 | 権限管理負荷 | 影響範囲 |
---|---|---|---|
シングル | 1つ | 大きい | 全体 |
マルチ | 環境・プロダクト別 | アカウント別に管理可能 | アカウント別に独立 |
弊社では本番アカウント、Sandboxアカウント、プロダクトアカウントと複数のAWSアカウントを活用してAWSインフラを運用しています。
2021年頃までは各アカウントにそれぞれのIAMユーザーが存在しており、AWS利用者は各アカウントのIAMユーザーの認証情報を持ってAWSへログインしていました。
ただAWSのログイン情報はブラウザのクッキーに保存される仕様となり、別のAWSアカウントへログインしようとすると現在ログインしているアカウントから強制的にログアウトされて毎回パスワード入力を求められるという非常に面倒な運用となっていました。
もちろん対応策はありまして、AWSではマルチアカウント管理のベストプラクティスとしてAWS ControlTowerを使った運用方法について紹介しています。2
しかし、AWS ControlTowerはAWS Organizations3による組織単位でアカウントをコントロールできるサービスであり、AWS Organizationsを有効化しなければなりません。
弊社は請求代行サービスを利用しているのですが、AWS請求代行サービス企業のRootアカウント配下に弊社のAWSアカウントが作成されてしまい、自由にAWS Organizationsを使うことができません。 このためAWS ControlTowerによるマルチアカウント運用は導入できないので、別の方法を使ってAWSマルチアカウント運用を実施しました。
アーキテクチャ
今までは各AWSアカウントにIAMユーザーを登録して個々人で管理していた認証情報によるログインでしたが、ユーザーがログインするアカウント先をjumpアカウントと呼ばれる各AWSアカウントへスイッチするための専用アカウントのみに集約いたしました。
これによりユーザーはジャンプアカウントの認証情報のみを管理して、各アカウントへSTS(Security Token Service)と呼ばれる一時的認証情報を使ってスイッチします。
これはIAMの機能の一つであるAssume Roleを活用することで実現できる機能です。
Assume Roleについて
Assumeとは日本語で、引き受けるという意味を持ちます。
各アカウントに作成したIAMロールが持つ権限を、ジャンプアカウントのIAMユーザーがロールを引き受けて各アカウントへスイッチします。
EC2にIAMロールをアタッチさせてS3へのアクセスを許可させるといったことを経験してきた人もいると思いますが、あちらはEC2にIAMロールが持つ権限を渡すPassRoleと呼ばれます。
IAMロールそのものにはAWSリソースを操作する権限は持たず、IAMロールにアタッチされているIAMポリシーがAWSリソースに対して読み込み、更新、削除といった権限を持っています。
弊社はAssume Roleを使って複数のAWSアカウントを運用しており、次章から実装手順について紹介いたします。
実装手順
まずはスイッチ先アカウントでジャンプアカウントに認証情報と操作権限を渡すIAMロールを作成します。
IAMロール作成
1. エンティティ付与
IAMロールを新規に作成するときに、「信頼されたエンティティタイプ」をAWSアカウントに変更し「別のAWSアカウントID」にジャンプアカウントのIDを記載します。(AWSアカウントIDは画面の右上に記載されています)
2. IAMポリシーアタッチ
ジャンプアカウントに渡す許可ポリシーを選択します。
3. IAMロール作成
ロール名と説明に概要を記載してIAMロールを作成します。
作成後にIAMロールのARNと「コンソールでロールを切り替えるためのリンク」のURLを手元に控えてください。
ジャンプアカウントIAMユーザー作成
スイッチ先アカウントでIAMロールを作成したら次はジャンプアカウントで操作します。
1. 新規ユーザー作成
IAMユーザーからユーザーを追加を選択してAssume Roleを引き受けるユーザーを作成します。
2. ポリシー作成
ポリシーの付与ではAssume Roleを引き受けることができるIAMポリシーを新規に作成します。
ここで先程手元に控えたIAMロールのARNを転記します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::XXXXXXXXXXXX:role/SandboxSwitchSRERole" #XXXXの部分はスイッチ先のAWSアカウントID } ] }
残りはタグ設定ですので、管理しやすいタグを設定してIAMユーザーを作成します。
ジャンプアカウントから別AWSアカウントへスイッチ
作成したIAMユーザーでジャンプアカウントにログインした状態で、もう一つ手元に控えた「コンソールでロールを切り替えるためのリンク」のURLへアクセスしてください。 ロールの切り替え画面が表示され、スイッチ先のAWSアカウントIDと作成したIAMロール名が表記されています。
またスイッチ先の表示名と色も設定できますので、複数のアカウントを使い分ける場合は別々の色でアカウントを間違えないようにしましょう。
ちゃんとスイッチできますと右上のユーザー情報にジャンプアカウント情報とスイッチ先アカウント情報の両方が表示されます。
他のスイッチ先アカウントでも同様にIAMロールを作成して、ジャンプアカウントのIAMユーザーにAssume Roleを引き受けるIAMポリシーを付与すれば同じことができます。
所感
弊社でのAWSマルチアカウントの運用について紹介しました。
AWS Organizationsが使えないため若干セルフ管理する必要がありますが、一人のユーザーが複数のAWSアカウントの認証情報を持たずに済むのはセキュリティ的にも利便性的にも大きな改善となります。
皆さんも複数のAWSアカウントを運用していて認証情報の管理が煩わしいようでしたら是非試してみてください。