複数AWSアカウントを管理していると各アカウント内にあるIAMユーザやグループの権限管理が課題になることがあります。
例えば、開発者、テスター、運用者、管理者といった具合にグループを分け、それぞれ権限を設定している場合に、それぞれのAWSアカウントに対して設定をしていくのは手間がかかります。2〜3個程度ならポチポチで我慢すればできるかもしれませんが、10や100以上になってくると自動化が必要になってきます。また、設定を何とか終えたとしても、(あるAWSサービスを使いたくなったので権限追加してほしいなど)権限変更が頻繁に発生したりすることもあります。
そういった状況下においてCloudFormationやTerraformを用いた自動化が有効になるでしょう。コード化しておいて修正・変更がある度に各AWSアカウントに対して実行すれば間違えることなく適用されます。また、コード化しておくことで履歴が残るので後から追いやすくなるメリットもあります。 しかし、多数のAWSアカウントだと一つずつAWSアカウントに対して適用していくのも骨が折れそうです。
最近(といっても昨年7月頃ですが)、CloudFormation StackSetsという機能がリリースされました。
CloudFormation スタックセットを利用した 複数のAWSアカウントやリージョンを横断したリソース展開 | Amazon Web Services ブログ
CloudFormation StackSetsを使うことで、テンプレートを複数のAWSアカウント、複数のリージョンに対してスタック(AWSリソースを管理する単位)を作成することができ、1回の実行で各々作成されたスタックに対して変更を適用することができます。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html
これは地味かもしれませんが、嬉しい機能です。例えば、テンプレートとして用意されている、CloudTrailやConfigの有効化/設定化や、IAM管理ポリシーの作成などを今までは各AWSアカウント、リージョン毎に対して一つ一つ適用する必要がありましたが、スタックセットによって1つのAWSアカウントから一気に適用を展開することができるようになります。
本記事は一例として、IAMグループ、ポリシーを記述したCloudFormationテンプレートをスタックセットによって一斉適用してみました。
IAMポリシー
コードは社内限定されているため、公開できませんが、以下のようなテンプレートファイルとなっています。
- group.yml ・・・ IAMグループに関するCloudFormationテンプレート
- policy.yml ・・・ IAM管理ポリシーに関するCloudFormationテンプレート
スタックセット
今回は2つのスタックセットを作成してみました。
- iam-group ・・・ group.ymlを適用するスタックセット
- iam-policy ・・・ policy.ymlを適用するスタックセット
AWSアカウント
上図では管理用アカウント(Administrator account)からスタックセットを実施していますが、今回は簡略化のため、2つのAWSアカウントのみでやってみました。アカウントAが管理用アカウント兼ターゲットアカウントとなります。
- アカウントA ・・・ スタックセット、スタックを実行するAWSアカウント
- アカウントB ・・・ スタックが実行されるAWSアカウント
初期設定
以下を参考に設定します。
- AWS CloudFormation StackSets の使用開始 - AWS CloudFormation
- [新機能] CloudFormation StackSetsを試してみた | Developers.IO
スタックセットにおけるスタックの更新
アカウントAから行います。スタックセットにおけるスタックの更新を行い、アカウントA及びアカウントBのAWSアカウントに対してIAMポリシーの変更を行ってみます。
今回はIAMポリシーを更新したいので選択し、「スタックセットのスタックを管理」をクリックします。
「スタックの編集」を選択します。
「テンプレートをAmazon S3にアップロード」を選択し、「参照」ボタンからCloudFormationテンプレートファイルを選択します。
「同時アカウントの最大数」では今回は2つのAWSアカウントなので「2」に設定します。1のままでの良いのですが、2にすることで完了時間が早くなります。
チェックボックスにチェックを入れて、「スタックの更新」を押すと更新が開始されます。
通常のCloudFormationのように変更点が表示されないので、各種リソースが置換(元のリソースが削除される)がないかを特定のAWSアカウントから試してみてもよいかと思います。
実行後、下図のようにスタックが更新されていればOKです。
「スタック」項目をみると、2つのAWSアカウントでスタック更新が行われていることがわかります。
最後に
CloudFormation StackSetsを用いてIAMポリシーを一斉に更新する方法を書きました。
今回は手動でスタックセットを更新しましたが、例えば、CodeCommitとCodePipelineを組み合わせてMasterブランチにマージ後に自動的にスタックセットが更新されるようになればますます便利になりそうですね。