

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS CDK を使用して AWS Service Catalog ポートフォリオと製品のデプロイを自動化する
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk"></a>

*Amazon Web Services、Sandeep Gawande、Vyoma Sachdeva、RAJNEESH TYAGI*

## 概要
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-summary"></a>

AWS Service Catalog は、組織の AWS 環境での使用が承認された IT サービスまたは*製品*のカタログを一元管理するのに役立ちます。*ポートフォリオ*とは製品の一群のことです。これには設定情報も含まれます。AWS Service Catalogでは、組織のユーザータイプごとにカスタマイズしたポートフォリオを作成し、適切なポートフォリオへのアクセス権を選択的に付与できます。そうすれば、ユーザーはポートフォリオ内から必要な製品をすばやくデプロイできます。

マルチリージョンアーキテクチャやマルチアカウントアーキテクチャなどの複雑なネットワークインフラストラクチャを使用している場合は、Service Catalog ポートフォリオを単一の中央アカウントで作成および管理することをお勧めします。このパターンでは、AWS Cloud Development Kit (AWS CDK) を使用して、中央アカウントでの Service Catalog ポートフォリオの作成を自動化し、エンドユーザーにそのポートフォリオへのアクセスを許可し、オプションで 1 つ以上のターゲット AWS アカウントに製品をプロビジョニングする方法を説明します。このすぐに使用できるソリューションにより、ソースアカウントに Service Catalog ポートフォリオが作成されます。また、オプションで AWS CloudFormation スタックを使用してターゲットアカウントに製品をプロビジョニングし、製品の TagOptions を設定するのに役立ちます。
+ **AWS CloudFormation StackSets** — StackSets を使用して、複数の AWS リージョンとアカウントにわたってService Catalog 製品を起動できます。このソリューションでは、このソリューションをデプロイするときに製品を自動的にプロビジョニングできます。詳細については、[AWS CloudFormation StackSets](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/using-stacksets.html) (Service Catalog ドキュメント) と [StackSets の概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html) (CloudFormation ドキュメント) を参照してください。
+ **TagOption ライブラリ** — TagOption ライブラリを使用して、プロビジョニングされた製品のタグを管理できます。*TagOption* は AWS Service Catalog で管理されるキーと値のペアです。これは AWS のタグではありませんが、TagOption に基づいて AWS のタグを作成するためのテンプレートとして機能します。詳細については、[TagOption ライブラリー](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/tagoptions.html) との共有(Service Catalog ドキュメント) を参照してください。

## 前提条件と制限
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-prereqs"></a>

**前提条件**
+ Service Catalog ポートフォリオを管理するためのソースアカウントとして使用するアクティブな AWS アカウント。
+ このソリューションを使用して 1 つ以上のターゲットアカウントに製品をプロビジョニングする場合、ターゲットアカウントはすでに存在し、アクティブである必要があります。
+ AWS Service Catalog、AWS CloudFormationおよび AWS IAM にアクセスするための AWS Identity and Access Management (IAM) 権限。

**製品バージョン**
+ AWS CDK バージョン 2.27.0

## アーキテクチャ
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-architecture"></a>

**ターゲットテクノロジースタック**
+ 一元管理された AWS アカウントのService Catalog ポートフォリオ
+ ターゲットアカウントにデプロイされたService Catalog 製品

**ターゲット アーキテクチャ**

![\[AWS CDK がService Catalog ポートフォリオを作成し、ターゲットアカウントに製品をプロビジョニングします。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/e8f217a7-aec4-4c85-8f6b-f91995506be0/images/1f027b82-14c3-485a-909b-1544e974b90a.png)


1. ポートフォリオ (または *ソース*) アカウントで、**config.json** ファイルを AWS アカウント、AWS リージョン、IAM ロール、ポートフォリオ、ユースケースの製品情報で更新します。

1. AWS CDK アプリケーションをデプロイします。

1. AWS CDK アプリケーションはデプロイメント IAM ロールを引き受け、**config.json** ファイルに定義されているService Catalog ポートフォリオと製品を作成します。

   ターゲットアカウントに製品をデプロイするように StackSets を設定した場合、プロセスは続行されます。製品をプロビジョニングするように StackSets を設定していない場合、プロセスは完了です。

1. AWS CDK アプリケーションは**StackSet 管理者**ロールを引き受け、**config.json** ファイルで定義した AWS CloudFormationスタックセットをデプロイします。

1. ターゲットアカウントでは、StackSets が **StackSet の実行**ロールを引き受け、製品をプロビジョニングします。

## ツール
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-tools"></a>

**AWS サービス**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) は、AWS クラウドインフラストラクチャをコードで定義してプロビジョニングするのに役立つソフトウェア開発フレームワークです。
+ [AWS CDK Toolkit](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) は、 AWS CDKアプリケーションの操作に役立つコマンドラインクラウド開発キットです。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) を使用すると、AWS リソースをセットアップし、迅速かつ一貫したプロビジョニングを行い、AWS アカウントとリージョン全体でライフサイクル全体にわたってリソースを管理できます。
+ 「[AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。
+ [AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) では、AWS で承認された IT サービスのカタログを一元管理できます。エンドユーザーは、組織によって設定された制約に従って、必要な承認済みの IT サービスのみをすばやくデプロイできます。

**コードリポジトリ**

このパターンのコードは、GitHub 内の「[aws-cdk-servicecatalog-automation](https://github.com/aws-samples/aws-cdk-servicecatalog-automation.git)」リポジトリで利用できます。コードリポジトリには以下のファイルとフォルダが含まれています。
+ **cdk-sevicecatalog-app** — このフォルダには、このソリューションの AWS CDK アプリケーションが含まれています。
+ **config** — このフォルダには、Service Catalog ポートフォリオに製品をデプロイするための **config.json** ファイルと CloudFormation テンプレートが含まれています。
+ **config/config.json** — このファイルにはすべての設定情報が含まれています。このファイルを更新して、ユースケースに合わせてこのソリューションをカスタマイズします。
+ **config/templates** — このフォルダには、サービスセンター製品のCloudFormation テンプレートが含まれています。
+ **setup.sh** — このスクリプトはソリューションをデプロイします。
+ **uninstall.sh** — このスクリプトは、スタックと、このソリューションのデプロイ時に作成されたすべての AWS リソースを削除します。

これらのファイルを使用するには、[エピック](#automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-epics)セクションの指示に従ってください。

## ベストプラクティス
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-best-practices"></a>
+ このソリューションのデプロイに使用する IAM ロールは、[最小権限の原則](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) (IAM ドキュメント) に従う必要があります。
+ [AWS CDK でクラウドアプリケーションを開発するためのベストプラクティス](https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk/) (AWS ブログ記事) に従ってください。
+ [AWS CloudFormation のベストプラクティス](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) (クラウドフォーメーションドキュメント) に従ってください。

## エピック
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-epics"></a>

### 環境をセットアップします。
<a name="set-up-your-environment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AWS CDK Toolkitをインストールします。 | AWS CDK Toolkit がインストールされていることを確認します。次のコマンドを入力して、インストールされているかどうかを確認し、バージョンを確認します。 <pre>cdk --version</pre> がインストールされていない場合は、次のコマンドを実行してインストールします。<pre>npm install -g aws-cdk@2.27.0</pre>AWS CDK Toolkit のバージョンが 2.27.0 より前の場合は、次のコマンドを入力してバージョン 2.27.0 に更新します。<pre>npm install -g aws-cdk@2.27.0 --force</pre> | AWS DevOps、DevOps エンジニア | 
| リポジトリのクローン作成 | 次のコマンドを入力します。[追加情報](#automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-additional) セクションの*リポジトリのクローン* では、リポジトリの URL を含むコマンド全体をコピーできます。これにより、GitHub から [aws-cdk-サービスカタログ-自動化](https://github.com/aws-samples/aws-cdk-servicecatalog-automation) リポジトリがクローンされます。<pre>git clone <repository-URL>.git</pre>これにより、ターゲットディレクトリに `cd aws-cdk-servicecatalog-automation` フォルダーが作成されます。次のコマンドを入力して、このフォルダーに移動します。<pre>cd aws-cdk-servicecatalog-automation</pre> | AWS DevOps、DevOps エンジニア | 
| AWS 認証情報の設定 | 以下のコマンドを入力します。これらは、スタックをデプロイする AWS アカウントとリージョンを定義する以下の変数をエクスポートします。<pre>export CDK_DEFAULT_ACCOUNT=<12-digit AWS account number></pre><pre>export CDK_DEFAULT_REGION=<AWS Region></pre>AWS CDK の AWS 認証情報は、環境変数を通じて提供されます。 | AWS DevOps、DevOps エンジニア | 
| エンドユーザーIAM ロールのアクセス許可を設定する | IAM ロールを使用してポートフォリオとその中の製品へのアクセスを許可する場合、ロールには **servicecatalog.amazonaws.com**サービスプリンシパルが引き受ける権限が必要です。これらのアクセス権限を付与する方法については、[Service Catalog による信頼できるアクセスの有効化](https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-servicecatalog.html#integrate-enable-ta-servicecatalog) (AWS Organizations ドキュメント) を参照してください。 | AWS DevOps、DevOps エンジニア | 
| StackSets に必要な IAM ロールを設定します。 | StackSets を使用してターゲットアカウントに製品を自動的にプロビジョニングする場合は、スタックセットを管理および実行する IAM ロールを設定する必要があります。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html) | AWS DevOps、DevOps エンジニア | 

### ソリューションのカスタマイズとデプロイ
<a name="customize-and-deploy-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| CloudFormation テンプレートの準備 | この `config/templates` フォルダーで、ポートフォリオに含めたい製品の CloudFormation テンプレートを作成します。詳細については、[Working with AWS CloudFormation テンプレート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html) (CloudFormation ドキュメント) を参照してください。 | アプリ開発者、AWS DevOps、DevOps エンジニア | 
| 設定ファイルをカスタマイズします。 | `config` フォルダーで **config.json** ファイルを開き、ユースケースに適したパラメーターを定義します。特に明記されていない限り、以下のパラメータは必須です。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html)完成した設定ファイルの例については、[追加情報](#automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-additional) セクションの*サンプル設定ファイル*を参照してください。 | アプリ開発者、AWS DevOps、DevOps エンジニア | 
| ソリューションのデプロイ | 次のコマンドを入力します。これにより、AWS CDK アプリケーションがデプロイされ、**config.json** ファイルに指定されているService Catalog ポートフォリオと製品がプロビジョニングされます。<pre>sh +x setup.sh</pre> | アプリ開発者、AWS DevOps、DevOps エンジニア | 
| デプロイメントを確認する | 以下を実行して、デプロイが正常に完了したことを確認します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html) | AWS 全般 | 
| (オプション) ポートフォリオと製品を更新します。 | このソリューションを使用してポートフォリオや製品を更新したり、新しい製品をプロビジョニングしたりする場合：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk.html)たとえば、ポートフォリオを追加したり、リソースをさらにプロビジョニングできます。AWS CDK アプリケーションは変更のみを実装します。以前にデプロイしたポートフォリオや製品に変更がなければ、再デプロイしても影響はありません。 | アプリ開発者、AWS DevOps、DevOps エンジニア | 

### ソリューションをクリーンアップする
<a name="clean-up-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| (オプション) このソリューションによってデプロイされた AWS リソースを削除します。 | プロビジョニング済み製品を削除する場合は、[プロビジョニング済み製品の削除](https://docs.aws.amazon.com/servicecatalog/latest/userguide/enduser-delete.html) (Service Catalog ドキュメント)の手順に従ってください。このソリューションで作成されたリソースをすべて削除する場合は、次のコマンドを入力します。<pre>sh uninstall.sh</pre> | AWS DevOps、DevOps エンジニア | 

## 関連リソース
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-resources"></a>
+ [AWS Service Catalog コンストラクトライブラリ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_servicecatalog-readme.html) (AWS API リファレンス)
+ [StackSets の概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html) (CloudFormation ドキュメント)
+ [AWS Service Catalog](https://aws.amazon.com/servicecatalog) (AWS マーケティング)
+ [AWS CDK でのService Catalog の使用](https://catalog.us-east-1.prod.workshops.aws/workshops/d40750d7-a330-49be-9945-cde864610de9/en-US/4-builders-devs/sc-cdk) (AWS ワークショップ)

## 追加情報
<a name="automate-aws-service-catalog-portfolio-and-product-deployment-by-using-aws-cdk-additional"></a>

**リポジトリをクローンします**

リポジトリのクローンを作成するには、次の コマンドを入力します。

```
git clone https://github.com/aws-samples/aws-cdk-servicecatalog-automation.git
```

**サンプル設定ファイル**

以下は、サンプル値を含む **config.json** ファイルのサンプルです。

```
{
    "portfolios": [
        {
            "displayName": "EC2 Product Portfolio",
            "providerName": "User1",
            "description": "Test1",
            "roles": [
                "<Names of IAM roles that can access the products>"
            ],
            "users": [
                "<Names of IAM users who can access the products>"
            ],
            "groups": [
                "<Names of IAM user groups that can access the products>"
            ]
        },
        {
            "displayName": "Autoscaling Product Portfolio",
            "providerName": "User2",
            "description": "Test2",
            "roles": [
                "<Name of IAM role>"
            ]
        }
    ],
    "tagOption": [
        {
            "key": "Group",
            "value": [
                "finance",
                "engineering",
                "marketing",
                "research"
            ]
        },
        {
            "key": "CostCenter",
            "value": [
                "01",
                "02",
                "03",
                "04"
            ]
        },
        {
            "key": "Environment",
            "value": [
                "dev",
                "prod",
                "stage"
            ]
        }
    ],
    "products": [
        {
            "portfolioName": "EC2 Product Profile",
            "productName": "Ec2",
            "owner": "owner1",
            "productVersionName": "v1",
            "templatePath": "../../config/templates/template1.json"
        },
        {
            "portfolioName": "Autoscaling Product Profile",
            "productName": "autoscaling",
            "owner": "owner1",
            "productVersionName": "v1",
            "templatePath": "../../config/templates/template2.json",
            "deployWithStackSets": {
                "accounts": [
                    "012345678901",
                ],
                "regions": [
                    "us-west-2"
                ],
                "stackSetAdministrationRoleName": "AWSCloudFormationStackSetAdministrationRole",
                "stackSetExecutionRoleName": "AWSCloudFormationStackSetExecutionRole"
            }
        }
    ]
}
```