AWSマルチアカウント管理で気になること
概要
業務でAWSのマルチアカウント管理の設計を担当していますが、疑問に思った点があり記事として書き上げました。
私の考えは述べますが、正解がわからないのでAWSのマルチアカウント管理について詳しい知見をお持ちの人がいましたらアドバイスを頂けますと幸いです。
マルチアカウント管理
まず始めに複数のAWSアカウントを管理する場合の課題についてお話しします。
以下のように本番、ステージング、検証とそれぞれ別途AWSアカウントを分けており個別にアカウント(IAMユーザー)を持っていると仮定します。
AWSはあるアカウントにログインした場合、同じブラウザで他のアカウントにログインしようとする場合、今ログインしているアカウントからログアウトしてもう一度ログインし直さないといけません。
さらにAWSのログインにMFA(multi-factor authentication)を必須とした場合、毎回自分のスマートフォンから、MFAアプリを起動してワンタイムパスワードを入力するという手間が生じます。
弊社でもこの運用でかなり面倒という気持ちがありました。
ほかにもこのように各AWSアカウントにそれぞれIAMユーザーを登録して運用することに以下の問題点があります。
- 権限変更や退職に伴うユーザー削除が発生する場合、各アカウントごとに同じ操作を実施する必要がある
- アカウントごとにクレデンシャル情報を個々人に管理してもらうことになり、管理の手間が嵩む
これらを解決するためにIAMロールによるクロスアカウントアクセスを活用することでIAMユーザーの一元管理を実現します。
クロスアカウントアクセス
クロスアカウントアクセスでは以下のようにジャンプアカウントとよばれるほかのAWSアカウントへスイッチするための踏み台アカウントにユーザーはログインし、そこから複数AWSアカウントにスイッチしてマルチアカウント管理を実現する設計です。
ジャンプアカウントにIAMユーザーを登録し、それぞれのアカウントにはIAMロールを作成します。
そしてAWS STSによってジャンプアカウントのIAMユーザーはスイッチ先のIAMロールから一時的な認証情報を取得します。
スイッチ先のロールはスイッチ用のURLを発行してくれますので、ジャンプアカウントにログインした状態でスイッチURLにアクセスすればスイッチ先のアカウントにスイッチできます。
スイッチURLイメージ
https://signin.aws.amazon.com/switchrole?roleName=SwitchRole&account=0123456789
疑問点
詳細な実装方法について今回は割愛しまして、私が今回AWSマルチアカウント管理を設計してこの場合どうすればよいのか分からなかった点について述べさせていただきます。
私は本番、検証と複数の環境にそれぞれ存在するエンジニアのIAMユーザーの権限情報を棚卸して開発、SREとチーム単位でIAMロールを作成しIAMポリシーを付与させることで権限管理を分かりやすくしようとしました。
こうすることで、DevチームにはCodeシリーズの権限やLambdaアクセスの権限などを渡し、SREチームにはEC2の作成権限を渡すといったチームごとのIAM権限管理を実現しています。
基本IAMロールにIAMポリシーを付与しますので、個々人用にIAMロールを作成することがなくなりますので、スイッチ先のIAMロールがスッキリし管理の効率化を狙いました。
ところが今までの運用では同じチームでも権限が異なることがありました。
異なるケース
例えば検証環境ではDevチームにDynamoDBのアクセス権限を与えないIAM権限にしていたとします。
ここでDevチームのエンジニアAがDynamoDBを使った新しいアプリ開発の検証をしたいと希望があります。
もしこの時AにDynamoDBのアクセス権限を渡すとなると、Devチーム全体のIAM RoleにDynamoDBの権限を与える必要が出てきます。
そうなるともちろんほかのDevチームにもDynamoDBの権限を与えてしまうことになります。
こうしたケースが積み重なってくると当初設計していたIAMロールの権限設計から乖離が生じてくると思います。
IAMロールを別に分けてスイッチしてもらうことも考えましたが、そうなるとスイッチロールの管理をエンジニアに強いてしまい、管理コストの手間が増えてしまうような気がします。
- https://signin.aws.amazon.com/switchrole?roleName=Dev&account=0123456789
- https://signin.aws.amazon.com/switchrole?roleName=A&account=0123456789
ほかの方法としてIAMロールをチーム単位ではなく個人単位で発行して管理するという方法も考えました。
ただそうなるとエンジニアの数が増えるとIAMロールの数が増え、アカウントごとに管理するということになるとクロスアカウントアクセスの意味がないような気がします🤔
とりあえず現状は、Dev全体のIAMロールにDynamoDBのアクセス権限をつける運用で進めていますが、モヤモヤした気持ちが晴れず本当にこれでいいのかと疑問に思っています。
所感
AWSマルチアカウント管理の疑問点について書き連ねました。
自分でもこれが正しいのか疑問に思うところがありますが、ベストプラクティスがわからない状態です。
詳しい人がいましたらアドバイスの程どうかよろしくお願いいたします。
参考文献
Discussion