Amazon Web Services ブログ

会社標準の AWS Service Catalog 製品に対するマルチリージョン、マルチアカウントカタログを設定する方法

多くの AWS のお客様が、AWS での使用に承認されている IT サービスのカタログを作成して管理するために AWS Service Catalog を導入しています。AWS Service Catalog の ハブアンドスポークモデルを使用すれば、組織は事業部門 (LOB) に配信する IT サービスを一元管理できます。私と一緒に作業しているお客様の何人かは、組織全体のクラウドエンジニアリングチームなど、一元化されたチームによって管理されるグローバルカタログをセットアップする方法についての推奨事項を求めています。組織には、Amazon EC2 インスタンスや Amazon RDS データベースを作成する標準的な方法など、一連の一般的かつ標準化された AWS Service Catalog 製品があり、それを複数の AWS リージョンの複数の AWS アカウントを使用し、複数の LOB に配信することを考えています。組織は、ハブアンドスポークモデルの各スポークアカウントにポートフォリオをセットアップする必要があることを理解しており、スポークの AWS アカウントにそれぞれログインする代わりに、単一のガラスペイン (ハブアカウントのダッシュボードなど) からポートフォリオを管理する方法を求めています。ハブアンドスポークポートフォリオを管理するための単一のガラスペインは、スポークアカウントとして設定された数十から数百の AWS アカウントを持つ大企業には必要なものになっています。

このブログ記事では、ハブアカウントを単一のガラスペインとして使用して AWS Service Catalog を設定し、複数の AWS アカウントや複数のリージョンのハブアンドスポークポートフォリオを管理する方法について説明します。このアプローチにより、ハブアンドスポーク製品向けのハブアンドスポークモデルのポートフォリオ、製品、ポートフォリオのアクセス許可、その他の運用面を一元的に作成して管理できます。

どのような機能かを説明する前に、まずは AWS Service Catalog の主要な概念をいくつか確認しましょう。

  • AWS Service Catalog 製品は、構成情報と一緒に AWS にデプロイできるようにする AWS リソースを構築するためのブループリントです。
  • ポートフォリオは、構成情報と製品をまとめたコレクションです。
  • プロビジョニングされた製品AWS CloudFormation スタックです。
  • 制約は、ユーザーが製品をデプロイできる方法をコントロールします。起動制限を使用すると、製品を起動するために AWS Service Catalog が継承できるロールを指定できます。
  • AWS Service Catalog ポートフォリオと製品を簡単に設定および構成する方法については、Service Catalog reference blueprints を参照してください。

参考資料:

  •  AWS Service Catalog を初めて使用する場合は、AWS Service Catalogを使用してユーザーが利用できる AWS リソースをコントロールする方法を解説したブログ記事、Control AWS resources available to your users using AWS Service Catalog を参照してください。
  •  これまで AWS Service Catalog を使用してきて、モデルがどのように複数のアカウントに拡張されるかを理解したい場合は、ハブアンドスポークモデルの詳細をご確認ください。

AWS CloudFormation StackSets は、単一のアカウントから複数の AWS リージョン、複数のアカウントで CloudFormation テンプレートを実行する簡単な方法を提供します。CloudFormation テンプレートを使用して AWS Service Catalog リソースを作成できるようになると、2 つの機能 (テンプレートと StackSets) を組み合わせて、複数のリージョンおよび複数の AWS アカウントでポートフォリオや製品を作成して管理できます。
2 つの StackSet (マルチリージョンハブのセットアップ用と、スポークポートフォリオのセットアップ用) を使用することをお勧めします。単一のアカウントから両方の StackSet を実行すると、マルチリージョンのハブポートフォリオとスポークポートフォリオを管理するための単一のガラスペインが表示されます。

カタログのセットアップ処理のアーキテクチャ図は、以下のとおりです。

アーキテクチャ図

このブログ記事では、アーキテクチャ図で概説しているプロセスについて説明します。最初に、2 つのリージョン (us-east-1 および us-east-2) に同一のハブポートフォリオをセットアップします。これを行うには、ハブポートフォリオをセットアップするセクションのブログ記事にあるテンプレートのサンプルを使用して、us-east-1 および us-east-2 リージョンのハブアカウントで StackSet を実行してください。テンプレートはポートフォリオを作成し、サンプル製品をポートフォリオに追加して、ポートフォリオをスポークアカウントと共有します。

次に、スポークポートフォリオをセットアップします。AWS Service Catalog ポートフォリオをスポークアカウントに配信するセクションのブログ記事にあるテンプレートのサンプルを使用して、us-east-1 リージョンおよび us-east-2 リージョンのスポークアカウントで StackSet を実行します。テンプレートは次の操作を行います。

  1.  ハブポートフォリオをインポートする。
  2.  ローカルポートフォリオを作成する。
  3.  インポートされた製品をポートフォリオに追加する。
  4.  起動およびテンプレートの制約をセットアップする。
  5.  エンドユーザーにローカルポートフォリオへのアクセスを許可する。

このユースケースでは、みなさんは Cloud Center of Excellence (CCOE) チームのメンバーで、承認済みの Amazon EMR クラスターをエンドユーザーがデプロイできるようにしたいと考えていることとします。

前提条件:
このブログ記事で説明している手順を試すには、ハブとして使用する AWS アカウントへの管理者アクセス権と、スポークとして使用する AWS アカウントへのアクセス権が必要です。IAM ロールを作成し、ポートフォリオをセットアップして StackSet を実行します。

ハブポートフォリオをセットアップする

最初のタスクは、製品の配信に使用予定の、ハブの AWS アカウントにポートフォリオをセットアップすることです。このユースケースでは、2 つの AWS リージョンに同一のハブポートフォリオをセットアップし、両方のポートフォリオを同期させたいと考えていると想定しています。StackSets を使用して、ハブポートフォリオを複数のリージョンに同時にセットアップします。

ハブアカウントをセットアップする手順は以下のとおりです。

  1. ハブアカウントの CloudFormation StackSet ロールをセットアップします。
  2.  バージョン管理された Amazon S3 バケットを作成し、S3 バケットに配信する製品の CloudFormation テンプレートをアップロードします。
  3. ハブポートフォリオをセットアップするすべてのリージョンで CloudFormation StackSets を実行します。
    注:
    複数のリージョンでハブポートフォリオをセットアップしたくない場合には、以下のような手段があります。

    1. ステップ 1AWSCloudFormationStackSetExecutionRole の設定をスキップします。
    2. ステップ 3 をスキップして、代わりにハブアカウントでステップ 3 で特定した CloudFormation テンプレートを実行します。

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

ハブの AWS アカウントで、AWSCloudFormationStackSetAdministrationRoleAWSCloudFormationStackSetExecutionRole を作成する必要があります。これらのロールには、ハブの AWS アカウントとの信頼関係が必要です。CloudFormation サービスでは、これらのロールがハブアカウントの複数のリージョンで CloudFormation テンプレートを実行すると想定します。これらのロールを作成する方法については、「前提条件: スタックの設定操作へのアクセス許可の付与」を参照してください。

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

次に、ハブの AWS アカウントで、CloudFormation テンプレートを維持管理する S3 バケットを作成し、バケットでのバージョニングを有効化します。このバケットを公開する必要はありません。この演習では、以下の GitHub リポジトリで利用可能なテンプレートに基づいて EMR クラスター製品を作成します。作成した S3 バケットにテンプレートをアップロードします。この Amazon S3 オブジェクトを公開する必要はありません。

https://raw.githubusercontent.com/aws-samples/aws-service-catalog-reference-architectures/master/emr/sc-emr-ra.json

アップロードしたテンプレートの Amazon S3 パスをメモしておいてください。ステップ 3 でハブポートフォリオをセットアップするときには、このパスを入力して指定します。

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

注:
特定のリージョンのスポークアカウントにポートフォリオを配信する場合は、ハブアカウントでそのリージョンのハブポートフォリオをセットアップする必要があります。

ハブポートフォリオをデプロイするには、ハブアカウントから StackSet を作成する必要があります。StackSet を作成するには、このリンクで入手できる CloudFormation テンプレートをダウンロードして使用してください。StackSet の実行中に、前のセクションでアップロードした CloudFormation テンプレートの完全な S3 ファイルパスとして EMRCFNPath を指定してください。また、スポークアカウントの AWS アカウント ID を SpokeAccountID として指定する必要があります。ハブポートフォリオは、SpokeAccountID として指定されたアカウント ID と共有されます。us-east-1 および us-east-2 リージョンのハブアカウントで StackSet を実行します。

これで、選択したリージョンに「ハブポートフォリオのサンプル」という名前のポートフォリオが作成されます。ポートフォリオには製品も含まれ、指定されたスポークアカウントと共有されます。AWS マネジメントコンソールを開き、CloudFormation コンソールに移動して各リージョンで StackSet によって実行された StackSet の出力結果をメモしておきます。

後で、この値を使って CloudFormation テンプレートのスポーク設定を更新します。

ハブポートフォリオをセットアップしました。StackSets を使用して、ハブの AWS アカウントで設定したポートフォリオを管理できます。ハブアカウントの複数のリージョンで設定された複数のポートフォリオを管理するために、単一のガラスペインも作成しました。

注:

  • AWS Service Catalog を使用して新製品を配信するには:
    •  製品の CloudFormation テンプレートを S3 バケットにアップロードする必要があります。
    • 新しい製品を作成する際には、ハブの設定に使用した CloudFormation も変更します
    •  StackSet を使用して、スポークアカウントのローカルポートフォリオに製品を配信します。
  •  既存の製品の新しいバージョンを追加するには:
    • 新しいバージョンの CloudFormation テンプレートを S3 バケットにアップロードします。
    • CloudFormation のハブの設定を変更して、新しい製品アーティファクトのバージョンを作成します。新しいバージョンは、ハブアンドスポークモデルを介してスポークポートフォリオで利用可能になります。
  • 製品バージョンを非アクティブ化するには:
    • ハブアカウントのリージョンでバージョンを非アクティブ化すれば、スポークアカウントでも非アクティブ化できます。AWS CLI または AWS SDK for Python (Boto3) を使用すると、同一のマルチリージョンポートフォリオを自動で非アクティブ化できます。

AWS Service Catalog ポートフォリオをスポークアカウントに配信する

スポークアカウントのローカルポートフォリオの一元管理には、AWS CloudFormation StackSets を使用できます。ハブアカウントから StackSets を使用する前に、スポークアカウントに適切なロールが設定されているか確認する必要があります。

ステップ 1.スポークアカウントで StackSet ロールを設定する

スポークの AWS アカウントでは、ハブアカウントとの信頼関係を持つ AWSCloudFormationStackSetExecutionRole を作成する必要があります。このロールを作成する方法については、「前提条件: スタックの設定操作へのアクセス許可の付与」を参照してください。

これで、CloudFormation テンプレートを実行して、AWS スポークアカウントでポートフォリオの構造を設定できます。

ステップ 2.スポークアカウントにポートフォリオをセットアップする

StackSets を使用してローカルポートフォリオをセットアップします。StackSets では、単一の CloudFormation テンプレートが、指定されたスポークアカウントで実行されます。つまり、アカウントやリージョンとに依存するものではない必要があるということです。CloudFormation マッピング条件を使用して、テンプレート内にカスタムアカウントまたはリージョン固有のロジックを組み込むことができます。

注:

  • スポークアカウントにタグを移行していない場合は、StackSet を実行する前にタグをコピーまたは移行してください。
  • 同一アカウントの複数のグループを管理する必要がある場合は、スポーク設定の CloudFormation テンプレートを複数のテンプレートに分割できます。複数の StackSet を使用すれば、複数の CloudFormation の条件の要素を使用しなければならない複雑さを軽減できます。
  • 指定された CloudFormation テンプレートのサンプルは、スポークアカウントの IAM グループとロールに一貫した命名規則があることを前提としています。そうでない場合は、マッピングの定義を使用し、Fn::FindInMap 疑似関数を使用して各アカウントのポートフォリオへのアクセスを動的に許可することができます。
  • StackSet を使用してスポークアカウントで起動ロールを作成する場合は、ロールの名前がハードコーディングされていないことを確認してください。

この AWS CloudFormation テンプレートのサンプルは、次のリソースを作成します。

  1.  Sample-Spoke-Portfolio という名前のポートフォリオのサンプル。
  2.  EMR クラスターという名前の製品をポートフォリオに追加。
  3. IAM 起動ロール。EMR クラスター製品に関連付ける。
  4. エンドユーザーが c4.large または m4.large インスタンスのマスターノードインスタンスまたはコアノードインスタンスのみをデプロイできるようにするテンプレートの制約。
  5. cost-center の TagOption をポートフォリオのサンプルに関連付ける。
  6. エンドユーザーにポートフォリオへのアクセスを許可する。

テンプレートを実行する前に、スポーク StackSet テンプレートのサンプルをローカルコンピューターにダウンロードします。

次に、テキストエディターを使用してそれを開き、以下の操作を行います。

  1. マッピングセクションでcost-center、portfolio-id、product-id の適切な値をアップデートします。マッピングセクションで使用されているリージョン名を確認します。テンプレートのサンプルは、us-east-1 および us-east-2 リージョンを使用していることを前提としています。ポートフォリオを複数のリージョンに配信する場合は、マッピングを変更し、すべてのリージョンと、当該ポートフォリオ ID および製品 ID を含めます。前にメモした、ハブのリージョン固有のポートフォリオ ID と製品 ID を指定します。
    CostCenter:
    "UPDATE_SPOKE_ACCOUNT_ID_HERE":
    ID: "UPDATE_COST_CENTER_HERE"
    PortfolioID:
    us-east-1:
    "ID": "UPDATE_US-EAST-1-Hub-PORTFOLIO_ID_HERE"
    us-east-2:
    "ID": "UPDATE_US-EAST-2-Hub-PORTFOLIO_ID_HERE"
    EMRProductID:
    us-east-1:
    "ID": "UPDATE_US-EAST-1-Hub-PRODUCT_ID_HERE"
    us-east-2:
    "ID": "UPDATE_US-EAST-2-Hub-PRODUCT_ID_HERE"
  2. AdminPortfolioPrincipalAssociation リソースの PrincipalARN を確認または更新し、この製品を起動する IAM ユーザー/グループ/ロールの Amazon リソースネーム (ARN) の形式を含めてからファイルを保存します。エンドユーザーには、AWSServiceCatalogEndUserFullAccess ポリシーが関連付けられている必要があります。
  3. AWS Service Catalog と CloudFormation のサービスの制限を確認して、テンプレートの実行中に制限に達しないようにします。

次に、ハブアカウントから StackSet を作成し、前に変更したテンプレートを使用してスポークポートフォリオをデプロイする必要があります。StackSet を実行中に、すべてのスポークアカウントに存在するエンドユーザーの IAMGroupName が指定されていることを確認してください。また、すべてのスポークアカウント ID と適切なリージョンを指定する必要があります。

最後に、デプロイされたポートフォリオの構造を確認し、ローカルスポークポートフォリオからエンドユーザーとして EMR クラスターをデプロイする方法でテストします。

これで、マルチリージョンハブとスポークがセットアップされました。単一のリージョンで作成された StackSet からハブアンドスポークポートフォリオを作成することで、ポートフォリオの管理に使用可能な単一のガラスペインを作成できました。

まとめ

AWS Service Catalog を使用すれば、IT サービスのカタログを作成して組織に配信できます。このブログ記事では、StackSets とともに CloudFormation Service Catalog のリソースタイプを使用し、ハブアカウントに単一のガラスペインを作成してカタログをスポークアカウントで管理する方法について解説しました。

この記事にあるソリューションの実装についてご質問があれば、AWS Service Catalog フォーラムで新しいスレッドを立てるか、AWS サポートにお問い合わせください。

著者について

Kanchan Waikar は、アマゾン ウェブ サービスの AWS Marketplace ソリューションアーキテクトです。彼女は、お客様が AWS や AWS Marketplace の製品、AWS Service Catalog を使用してアーキテクチャを構築する支援ができることを嬉しく思っています。