【Service Catalog】組織内にポートフォリオを共有してメンバーアカウントから製品を起動してみた

Service Catalogを使ってメンバーアカウントにCFnテンプレートを共有してみたよ
2022.05.27

はじめに

マルチアカウントを運用していると、利用者がいつでも利用できるようなテンプレートを提供したいケースが出てきます。

例えば、最近以下のような通知の仕組みを考えたブログを書いたのですが、利用者には通知先の設定をCloudFormationで作成してもらう必要があります。

単純にCloudFormationテンプレートを渡してスタックを作ってもらってもいいのですが、テンプレートの管理場所を考えたりユーザーに共有したりする方法を検討する必要があります。

そこでもっと簡単に利用できる仕組みがないか考えた時、Service Catalogがいい感じに使えそうだったので試してみました。

上記のブログ実装を想定して、こんなイメージのものを作っていきます。

やってみる

先ほどの通知の仕組みをマルチアカウントに導入している想定で、メンバーアカウント側にメール通知するためのリソースをService Catalogを使って作成してみます。

管理者の委任

Service Catalogには管理者を委任する機能があります。最小権限の原則からなるべく委任しておくのがよいでしょう。検証したいだけであれば飛ばしてもらっても大丈夫です。

コンソールはまだ実装されていないため、AWS CLIを使って実施します。Organizationsの管理アカウント上で以下のコマンドを実行して下さい。

aws organizations register-delegated-administrator \
--account-id {委任先のアカウントID} \
--service-principal servicecatalog.amazonaws.com

エラーが出なければ委任は完了です。委任すると作成したポートフォリオの組織内共有ができるようになります。

ポートフォリオの作成

ここからは委任先のアカウントで実施していきます。まずはService Catalogのコンソールからポートフォリオの作成します。

各情報を入力して作成して下さい。今回は通知設定のポートフォリオなのでこんな感じにしてみました。

製品の作成・ポートフォリオへの追加

以下の図のような形で、作成したポートフォリオにCloudFormationを製品化してアップロードしていきます。

先ほど作成したポートフォリオの詳細から、「新しい製品のアップロード」をクリックしましょう。

製品名や製品の説明を入力していきます。

利用者に展開するCloudFormationテンプレートをここでアップロードします。

最後に「サポートの詳細」という項目もありますが、こちらは今回何も入力せずに製品の作成をクリックします。

これで製品の作成とポートフォリオへの追加は完了です。1つのポートフォリオに複数の製品を登録できるので、こんな感じに用途ごとに登録してみました。

起動制約の設定

作成したポートフォリオを共有する前に起動制約を追加します。起動制約とは製品を起動する際に使用する権限を指定する機能です。

この機能を使うことで、Service Catalogで製品を起動するユーザーがCloudFormationで作成するリソースの権限を持たずに利用することが可能となります。

参考:AWS Service Catalog の起動制約 - AWS Service Catalog

ポートフォリオの詳細から制約のタブを開いて「制約を作成」をクリックします。

製品を選び、制約タイプに「起動」を選択します。

起動時に実行するロールを選択するのですが、マルチアカウントで利用する場合は「ロール名を入力」を選択して下さい。ロール名だけを条件にすることで、メンバーアカウント上でも同じIMAロールを作成しておけば実行できます。

逆にIAMロールやARNを指定してしまうと管理アカウントのIAMロールが指定されてしまうので、メンバーアカウントから利用できずにエラーとなります。

今回は「ServiceCatalogAdmin」というロール名を指定しました。後ほどメンバーアカウント上でこの名前のIAMロールを作成していきます。

ポートフォリオの共有

作成したポートフォリオをOrganizations組織内ユーザーが利用できるように共有設定を行います。ポートフォリオの詳細画面でアクション > 共有 を開きます。

どの範囲に共有するかを選択していきます。今回は組織内に共有したいので、「AWS Organizations」を選択します。組織内のOUが表示されるので、共有先のOUを選択しましょう。全アカウントへ共有したければRootで大丈夫です。

これで共有は完了です。

起動制約で指定したIAMロールを作成する

ここからの作業はポートフォリオを利用したいメンバーアカウントで実施していきます。

まずは、先ほど起動制約で指定したIAMロール名の「ServiceCatalogAdmin」をメンバーアカウントに作成します。起動制約は共有先にも継承されているため、指定したロールがなければエラーとなるので注意しましょう。

参考:ポートフォリオの共有とインポート - AWS Service Catalog

IAMロールの作成で、信頼されたエンティティにService Catalogを選択してください。

アタッチするポリシーには「AdministratorAccess」を選択して、ロール名は起動制約で指定した「ServiceCatalogAdmin」とすることを忘れないようにしましょう。

今回は検証のためコンソールから作成しましたが、実際の運用ではStackSetsを使って事前に全アカウントへ作成しておくとこの作業を省略できてスムーズです。

ポートフォリオへアクセス権限を付与する

実はポートフォリオは共有しただけでは利用できません。追加でポートフォリオに対してアクセス権限を設定する必要があります。

ポートフォリオの詳細から「グループ、ロール、およびユーザー」タブを開き、「グループ、ロール、およびユーザーの追加」をクリックします。

すると、メンバーアカウント上に存在するIAMのグループやロール、ユーザーの選択画面になるので、アクセス権限を付与したいユーザーやロールを選択しましょう。

今回はAWS SSOを利用している環境なので、Service Catalogを利用するユーザー用のアクセス許可セット(から作成されたロール)を選択しました。Control Tower環境だとデフォルトでService Catalog用のアクセス許可セットが用意されていたので、事前に対象のアカウントへ追加しています。

これでポートフォリオに対するアクセス権限の追加は完了です。

製品をプロビジョニングする

ようやく共有したポートフォリオから製品をプロビジョニングしていきます。

先ほどアクセス権限を追加したロールに切り替えてログインします。するとインポートした製品が表示されるようになっています。

あとは製品を起動するだけです。製品の名前は任意で設定してもいいですし、名前を生成にチェックを入れると自動で名前を付けてくれます。

パラメータは製品を作成した時に設定したCloudFormationテンプレートによって変わります。今回は通知先のメールアドレスを入力しています。

入力が終わったら製品を起動しましょう。CloudFormationテンプレートで定義したリソースが作成されます。このときログインしているロールはSNSトピック作成などの権限を持っていませんが、起動制約で指定したロールが実行してくれるため問題なく製品の起動が可能です。

これで無事に管理アカウントから組織内にポートフォリオを共有、メンバーアカウントから製品の起動まで確認できました。これでメンバーアカウントのユーザー自身で、選択した通知先へ通知を遅れるような環境が作れましたと思います。

おわりに

初めてService Catalogをちゃんと使ってみましたが、マルチアカウント環境でうまく使えそうな場面がたくさんありそうという印象でした。

今回のような通知先の設定だけでなく、ログの設定やテンプレート化したネットワーク環境など利用者に使って便利なテンプレートを製品として登録しておくと捗りそうな気がします。

起動制約やポートフォリオ自体へのアクセス権限の追加など最初はわかりにくい部分も多いですが、是非うまく使いこなしてユーザーが便利に利用できるマルチアカウント環境に役立ててください。

参考