3月よりIE課(インターナルエデュケーション課) に異動しました山﨑です。
今回はITガバナンスを強化するための1つの手段である、AWS Service Catalog について整理していきます。
AWS Service Catalog について
AWS Service Catalog とは
AWS Service Catalog とはAWS上で承認されたITサービス(AWSサービス)のカタログを作成、管理することができるサービスです。
世の中には私たちが「選択疲れ」を引き起こしてしまうほどに様々な製品が存在しています。これらの製品の中から私たちが購入する商品を選択しやすいように整理(パッケージング)しているものがカタログと呼ばれるものです。
AWSでも200を超える多くのサービスが提供されているため、ユーザーが全てのAWSサービスを理解して利用することは困難です。そこでユーザーが利用するAWSサービスを選択しやすいように整理(パッケージング)しているものがAWS Service Catalogだと考えてみると理解しやすいかと思います。

AWS Service Catalog の構成要素
AWS Service Catalogで頻出する構成要素について簡単に整理しておきます。

| 構成要素 | 説明 |
|---|---|
| ポートフォリオ | 製品の集合体を示します。ポートフォリオをエンドユーザーに配布(アクセスを許可)することで、エンドユーザーは必要な製品を選択することができるようになります。 |
| 製品 | AWS上でデプロイできるようにしたいAWSサービスであり、CloudFormationテンプレートまたはTerraformで管理されています。 「入門ライブラリ」と呼ばれるWell-Architected な製品テンプレートが300以上用意されているため、こちらを活用することも可能です。 GitHub - aws-samples/aws-service-catalog-reference-architectures: Sample CloudFormation templates and architecture for AWS Service Catalog |
| アクセス | ポートフォリオへのアクセス権をユーザーに付与します。IAMユーザー/IAMグループ/IAMロールいずれかのIAMエンティティに対してアクセス権を付与します。 |
| 制約 | 製品を用いてAWSサービスをデプロイする際の方法を制御します。起動制約/テンプレート制約/通知制約 などから選択して必要な制御を行います。 |
| タグ | ポートフォリオに付与するタグを指定することができます。 |
| TagOptions | デプロイするAWSサービスに付与するタグのテンプレート群であり、ポートフォリオに関連付けることでタグの付与を強制することができます。TagOptions を利用するためには予め「TagOptions ライブラリ」にタグのテンプレートを登録しておく必要があります。 |
| 共有 | ポートフォリオを別のAWSアカウントに共有することができます |
AWS Service Catalog の利用シーン
実際にどのようなシーンで AWS Service Catalog の利用を検討するのか、簡単に整理しておきます。
統一された環境の提供
AWS Service Catalogを使用すると、事前に定義された製品(テンプレート)を使用して一貫した環境を簡単にデプロイすることができます。これにより、AWSの利用に不慣れな方でも簡単にAWS環境を用意することができます。
AWSリソース構築の自動化
AWS Service Catalog はCloudFormationテンプレートを基に製品を作成するため、テンプレート内に定義されたリソースの作成を自動化することができます。これにより手作業による人為的なミスを削減したり、不要なリソースの作成を防止したり、効率的なリソースの管理が可能になります。
ガバナンスの強化
AWS Service Catalog でカタログを作成することができるのは必要な権限を持つ管理者のみです。管理者が会社組織で定められたセキュリティポリシーや利用ルールに従ってカタログを作成することによりガバナンスの強化を実現することができます。
AWS Service Catalog を使ってみる
AWS Service Catalog ではカタログを作成する「管理者」と実際にカタログを利用する「エンドユーザー」の2人の登場人物が出てくるので、それぞれの役割ごとに整理しながらハンズオンをしていきたいと思います。
事前準備
- 管理者が利用するIAMユーザーおよびIAMグループの作成
- 今回はAdministratorAccess権限を付与
- エンドユーザーが利用するIAMユーザーおよびIAMグループの作成
- AWSServiceCatalogEndUserFullAccess権限を付与
- CloudFormation テンプレートの作成
AWS Service Catalog 利用における大まかな作業
管理者
| 項番 | 作業内容 | 備考 |
|---|---|---|
| 1 | ポートフォリオの作成 | 必須 |
| 2 | 製品の作成とポートフォリオへの関連付け | 必須 |
| 3 | ポートフォリオの設定(アクセス) | 必須 |
| 4 | ポートフォリオの設定(制約) | 任意 |
| 5 | ポートフォリオの設定(タグ) | 任意 |
| 6 | ポートフォリオの設定(TagOptions) | 任意 |
| 7 | ポートフォリオの設定(共有) | 任意 |
エンドユーザー
| 項番 | 作業内容 | 備考 |
|---|---|---|
| 1 | 製品の起動 | 必須 |
実作業(管理者)
ポートフォリオの作成

任意の名前でポートフォリオを作成します。「所有者」にはこのカタログを管理している部署または管理者を記載しておくことで、問い合わせ先が明確になります。

製品の作成とポートフォリオへの関連付け

任意の名前で製品を作成します。「所有者」にはこの製品を公開する個人または組織を記載しておくことで、問い合わせ先が明確になります。「ディストリビューター」はオプションですが、エンドユーザーが後に製品リストを検索する際に検索性が向上するので可能であれば記載しておきます。

ここでCloudFormationテンプレートをアップロードします。製品ではバーション管理が可能なため、バーション名も記載しておきしょう。ちなみに今回は以下のテンプレートを利用してみます。
AWSTemplateFormatVersion: "2010-09-09" Description: service catalog sample template Parameters: VpcCidr: Description: 'CIDR block for the VPC' Type: String AllowedValues: - 10.1.0.0/24 - 10.2.0.0/24 - 10.3.0.0/24 - 10.4.0.0/24 - 10.5.0.0/24 VpcName: Description: 'Give a Name Tag to VPC' Type: String Resources: MyVPC: Type: 'AWS::EC2::VPC' Properties: CidrBlock: !Ref VpcCidr EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: !Ref VpcName Outputs: CidrBlock: Value: !GetAtt MyVPC.CidrBlock

「サポートの詳細」ではエンドユーザーがカタログについて問い合わせをしたい場合の連絡先、必要に応じてサポートページのリンクを記載します。

最後に先程作成したポートフォリオに製品を追加します。


ポートフォリオの設定(アクセス)
ポートフォリオへのアクセス権をユーザーに付与します。今回は「Endusers」というIAMグループに対してアクセスを許可します。


ポートフォリオの設定(制約)
今回はポートフォリオに対して「起動制約」を設けます。「起動制約」では指定したIAMロールに割り当てられた権限の範囲内で製品を起動させることができます。これにより、カタログを利用するエンドユーザー(IAMユーザー/IAMグループ/IAMロール)には最小限の権限のみを許可するだけで済みます。


今回指定するIAMロールは「CreateVPCRoleForServiceCatalog」と命名しており、以下のIAMポリシーと信頼関係を設定しています。
IAMポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:CreateStack", "cloudformation:DeleteStack", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStacks", "cloudformation:GetTemplateSummary", "cloudformation:SetStackPolicy", "cloudformation:ValidateTemplate", "cloudformation:UpdateStack", "ec2:*", "s3:GetObject", "servicecatalog:*", "sns:*" ], "Resource": "*" } ] }
信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "servicecatalog.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

実作業(エンドユーザー)
製品を起動する
今回使用するエンドユーザー(IAMユーザー)の認証情報を用いてAWSアカウントにログインし、AWS Service Catalogのコンソール画面を開きます。製品一覧から起動したい製品を選択して「製品を起動」をクリックします。ちなみにこのIAMユーザーにはAWS Service Catalogのエンドユーザーに必要な最低限の権限のみが付与された「AWSServiceCatalogEndUserFullAccess」がアタッチされています。そのため、管理者とは異なりAWS Service Catalogの左メニューにはポートフォリオの項目がありません。

必要に応じて値を設定し、起動します

「プロビジョニングされた製品」の一覧画面でステータスが「使用可能」になっていることを確認します。実際にVPCのコンソール画面を確認するとVPCが作成されていることが確認できます。「AWSServiceCatalogEndUserFullAccess」のみがアタッチされたIAMユーザーではVPCのコンソール画面の閲覧権限がないため、今回の動作確認ではAdministratorAccess権限を付与した別のIAMユーザーで再度AWSアカウントにログインし、VPCが作成されたことを確認しています。


わざわざ別のIAMユーザーでログインしてAWSリソースが作成されたことを確認するのは面倒なので、CloudFormationテンプレートの「Outputs」で作成が完了したことが確認できるように必要なリソースの情報を出力しておくと、AWS Service Catalogの「出力」から情報を確認できるので、IAMユーザー切替の手間が省けます

まとめ
今回は以前から気になっていたAWS Service Catalog について基礎的な内容を整理してみました。他にも色々試してみて、有効活用する方法を模索していきたいと思います。
山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ
カスタマーサクセス部所属。2019年12月にインフラ未経験で入社し、AWSエンジニアとしてのキャリアを始める。2023 Japan AWS Ambassadors/2023-2024 Japan AWS Top Engineers