Service Catalogで製品のマルチアカウント、マルチリージョン共有をやってみた

非Organizations環境でService Catalogの製品をマルチアカウント×マルチリージョンで共有してみたよ。
2022.06.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Service CatalogはCloudFormationテンプレートをパッケージングして、AWSリソースの展開ができるサービスです。CloudFormationテンプレートのパッケージングした単位をService Catalogでは「製品」と呼んでいます。また、製品をまとめたものを「ポートフォリオ」と呼び、この単位で特定のユーザーへアクセス許可を与えたり、利用時の制約を設定できたりします。

単一アカウントだけでなく、複数アカウントへ展開したいケースもあります。そのときはポートフォリオの共有機能を使うことで、複数アカウントに共有できました。

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

これだと単一リージョンへの共有はできるのですが、マルチリージョンに製品を展開したい場合は、リージョン分同じ作業が必要です。そんなケースに対応できそうなAWSブログがあったので試してみました。

やってみる

先ほど紹介したAWSブログを参考に実施します。Service Catalogにはマルチリージョンにポートフォリオを共有する機能はないので、StackSetsを使ってポートフォリオの作成と共有を行います。

ざっくりですが、理解を深めるために構築できる環境を図にしました。(見づらくごめんなさい…別タブで画像開いてみてください。)

ぱっと見は複雑ですが、構築しながら1つ1つ確認すれば難しくはない(はず)です。また、参考にした手順は非Organizations環境でを想定して作成されていますが、わかりやすくするため以下の呼称で進めます。

  • ポートフォリオの共有元:管理アカウント
  • ポートフォリオの共有先:メンバーアカウント

【管理アカウント】ポートフォリオの作成

まずはService Catalogの管理アカウント側にハブとなるポートフォリオを作成していきます。

ステップ 1: CloudFormation StackSet ロールをセットアップする

まずはStackSetsを利用するためのロールを管理アカウントに作成します。以下ブログのクイック作成リンクを使うと簡単に作成できます。

StackSets用IAM Roleのクイック作成リンク作ってみた | DevelopersIO

「管理側I作成」と「ターゲット側作成」2つとも管理アカウント上に作成してください。

ステップ 2: S3 バケットを作成し、製品の CloudFormation テンプレートをアップロードする

次にCloudFormationテンプレートをS3バケットにアップロードしていきます。まずこちらのテンプレートsc-emr-ra.jsonを保存しておきましょう。

お好みの名前でS3バケットを作成してください。今回はservice-catalog-product-bucket-{アカウントID}で作成しました。

作成したバケットに先ほどのCloudFormationテンプレートをアップロードしてください。オブジェクトURLを後で使用するため控えておきましょう。

ステップ 3: CloudFormation StackSets を実行して、ハブの AWS アカウントにハブポートフォリオをセットアップする

次に複数リージョンでポートフォリオを作成していきます。以下のリンクをクリックするとポートフォリオを作成するためのテンプレートblog-part1.ymlがダウンロードできます。

ポートフォリオテンプレート

CloudFormationのコンソールからStackSetsを開いて「StackSetsの作成」をクリックします。

テンプレートの選択画面は以下のように入力してください。

  • IAMロール名:AWSCloudFormationStackSetAdministrationRole
  • テンプレートの指定:テンプレートファイルのアップロード
    • ファイルの選択→blog-part1.ymlをアップロード

上記入力できたら次へ進みます。

StackSet の詳細を指定では以下のように入力します。

  • StackSet 名:StackSets-Portfolio-Sample(お好みで変更して下さい)
  • パラメータ
    • EMRCFNPath
      • 先ほどS3へアップロードしたテンプレートのS3 URI
    • SpokeAccountID
      • ポートフォリオを共有したいアカウントID

デプロイオプションの設定は、バージニア北部(us-east-1)とオハイオ(us-east-2)リージョンに展開するよう設定します。

  • アカウント
    • アカウント番号:管理アカウントID
  • リージョンの指定
    • バージニア北部
    • オハイオ

他はデフォルトで作成してください。ステータスがSUCCEEDEDになれば完了です。

バージニア北部とオハイオリージョンのコンソールからCloudFormationのスタックを確認してください。新規作成されたスタックの出力タブにPortfolioIDProductIDが記載されているので、2リージョンとも値を控えておきましょう。

ここまでで、管理アカウント側の2リージョンポートフォリオの作成とメンバーアカウントへの共有までできました。

【メンバーアカウント】ポートフォリオの作成

次にメンバーアカウントに共有されたポートフォリオの製品を取得して、制約やアクセス許可を追加したポートフォリオを作成します。ここからは共有先として指定したアカウントで実施してください。

ステップ 1.StackSet ロールを設定する

管理アカウントで行なったようにStackSets用のIAMロールを作成します。

StackSets用IAM Roleのクイック作成リンク作ってみた | DevelopersIO

「管理側I作成」と「ターゲット側作成」2つとも作成してください。ターゲット側のテンプレートで入力するアカウントIDは実行しているアカウントIDを入力してください。

ステップ 2.ポートフォリオをセットアップする

次にポートフォリオをインポートするためのCloudFormationテンプレートをStackSetsで展開します。

以下のリンクからテンプレート(blog-part2.yml)をダウンロードしてください。

ポートフォリオインポート用テンプレート

ダウンロードできたら、ファイルを開いて以下の部分を修正します。

  • CostCenter
    • UPDATE_ACCOUNT_ID_HERE:実行するアカウントID
    • UPDATE_COST_CENTER_HERE:お好みで(そのままでも動作確認はできます。)
  • PortfolioID
    • 管理アカウント側のスタック出力で確認したPortfolioID
  • EMRProductID
    • 管理アカウント側のスタック出力で確認したProductID
Mappings: 
  CostCenter: 
    "UPDATE_ACCOUNT_ID_HERE":
      ID: "UPDATE_COST_CENTER_HERE"
  PortfolioID: 
    us-east-1: 
      "ID": "UPDATE_US-EAST-1-PORTFOLIO_ID_HERE"
    us-east-2: 
      "ID": "UPDATE_US-EAST-2-PORTFOLIO_ID_HERE"
  EMRProductID: 
    us-east-1: 
      "ID": "UPDATE_US-EAST-1-PRODUCT_ID_HERE"
    us-east-2: 
      "ID": "UPDATE_US-EAST-2-PRODUCT_ID_HERE"

上記の変更ができたら保存しましょう。

あとは管理アカウント側と同じように、StackSetsでバージニア北部とオハイオにスタックを展開していきます。

CloudFormationのコンソールからStackSetsを開いて「StackSetsの作成」をクリックします。

テンプレートの選択画面は以下のように入力してください。

  • IAMロール名:AWSCloudFormationStackSetAdministrationRole
  • テンプレートの指定:テンプレートファイルのアップロード
    • ファイルの選択→blog-part2.ymlをアップロード

StackSet の詳細を指定では以下のように入力します。

  • StackSet 名:Sample-Spoke-Portfolio(お好みで変更して下さい)
  • パラメータ
    • IAMGroupName
      • ポートフォリオへのアクセス許可を与えたいIAMグループ名

デプロイオプションの設定は、バージニア北部(us-east-1)とオハイオ(us-east-2)リージョンに展開するよう設定します。

  • アカウント
    • アカウント番号:メンバーアカウントID
  • リージョンの指定
    • バージニア北部
    • オハイオ

他はデフォルトのまま作成しましょう。これでメンバーアカウント側の新規ポートフォリオの作成は完了です。

Service Catalogのポートフォリオを確認してみると、ローカルのタブには新規で作成した「Sample-Spoke-Portfolio」が確認できます。管理アカウントから共有したポートフォリオは「インポートした」のタブにありました。

バージニア北部とオハイオどちらも同じ設定のポートフォリオが作成できました。

以上で動作確認は終了です。

おわりに

Service Catalogの製品をマルチアカウント×マルチリージョンに展開する方法を試してみました。今回はサンプルで用意されているCloudFormationテンプレートで実施しましたが、これをもとにアレンジして使ってもよさそうです。

今回は1つのアカウントに共有しましたが、Organizations統合でOUへの共有やStackSetsを利用するともう少し楽に展開できると思います。次はOrganizations環境下のマルチリージョン展開を試したいですね。

参考