目次
- 承認済みリソースのセルフサービスポータル・ガバナンス基盤
- 概要
- Service Catalog が解決する課題
- 主な特徴
- アーキテクチャと基本概念
- コアコンポーネント詳解
- ポートフォリオの設計
- 製品(Product)の定義
- 制約(Constraints)詳解
- エンドユーザーの製品展開
- AppRegistry との統合
- Control Tower Account Factory との連携
- Terraform 統合
- 設定・操作の具体例
- CLI / SDK / IaC
- Hashicorp Terraform との比較
- AWS Proton との比較
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース・参考文献
- 実装例・活用シーン
- スケーリング・マルチアカウント
- セキュリティ・IAM
- 監視・コンプライアンス
- チェックリスト
- まとめ
AWS Service Catalog 完全ガイド v2.0
承認済みリソースのセルフサービスポータル・ガバナンス基盤
AWS Service Catalog は、「IT 管理者が CloudFormation / Terraform テンプレートをポートフォリオにまとめ、エンドユーザー(開発者)がセルフサービスで承認済みリソースを展開できるサービスであり、ガバナンス(コンプライアンス・タグ標準化・IAM 権限制御)と開発者の生産性を両立する」 です。制約(Constraints)により展開後の変更範囲を制限し、AppRegistry で展開リソースを一元管理、Control Tower の Account Factory と統合してアカウント自動プロビジョニング。本ドキュメントは Service Catalog の概念・ポートフォリオ・製品・制約・2025-2026 最新動向を体系的に解説する包括的ガイドです。
ドキュメント目的
本ガイドは以下を対象としています。
- 初心者向け: Service Catalog とは何か、CloudFormation との違いを学びたい方
- IT 管理者向け: 承認済みリソースのカタログを構築・運用したい方
- アーキテクト向け: マルチアカウント環境でのガバナンス実装
- DevOps / インフラ向け: Terraform / CDK との統合、自動化
- セキュリティ / コンプライアンス向け: リソース・設定・タグ統制
2025-2026 年の AWS Service Catalog エコシステム
- Terraform Provider サポート強化:HCL テンプレートの完全統合
- AppRegistry 統合深化:Service Catalog から直接アプリケーション定義
- CloudFormation Hooks 連携:デプロイ前のコンプライアンスチェック自動化
- IaC Pipeline 統合:CodePipeline で製品バージョン自動更新
- マルチリージョン・マルチアカウント:Organizations 経由での自動配布
- AI による制約推奨:セキュリティ・コスト最適化の自動提案
- ビジュアルポートフォリオ エディタ:ノーコードで製品管理可能に
目次
- 概要
- Service Catalog が解決する課題
- 主な特徴
- アーキテクチャと基本概念
- コアコンポーネント詳解
- ポートフォリオの設計
- 製品(Product)の定義
- 制約(Constraints)詳解
- エンドユーザーの製品展開
- AppRegistry との統合
- Control Tower Account Factory との連携
- Terraform 統合
- 設定・操作の具体例
- CLI / SDK / IaC
- Hashicorp Terraform との比較
- AWS Proton との比較
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース・参考文献
- 実装例・活用シーン
- スケーリング・マルチアカウント
- セキュリティ・IAM
- 監視・コンプライアンス
- チェックリスト
- まとめ
- 参考文献
概要
初心者向けメモ: Service Catalog は「企業の IT 部門が『承認済み構成』のみを開発チームに提供するサービス」です。開発者が直接 CloudFormation を実行すると、未承認のリソース設定(セキュリティグループ規則、IAM ポリシー等)をデプロイするリスクがあります。Service Catalog を使うと、IT 部門が事前に検証した「安全なテンプレート」だけを開発者に見せ、変更不可な部分(IAM ロール、タグ等)を埋め込むことで、ガバナンスと開発生産性を両立できます。
AWS Service Catalog 公式定義:
「AWS CloudFormation テンプレートのセルフサービス提供ポータル。IT ガバナンスとエンドユーザーの自由度のバランスを実現」
参照:What is AWS Service Catalog
Service Catalog が解決する課題
課題 1:ガバナンス vs 生産性のトレードオフ
❌ 従来の方法
- 完全ロックダウン:全リソース作成を IT 部門が手動実施 → 開発速度低下
- 完全オープン:開発者が自由に AWS リソース作成 → セキュリティ・コスト制御喪失
✅ Service Catalog 活用
- IT 部門:CloudFormation テンプレート事前作成・承認
- 開発者:Service Catalog から「承認済み製品」のみ選択・展開
- 結果 :安全性確保 + 開発速度維持
課題 2:リソース設定の属人化・不統一
複数部門が異なる設定ルール(セキュリティ、タグ、ネットワーク)でリソースを作成。Service Catalog で全社統一構成を強制。
課題 3:コンプライアンス・監査への対応
金融・医療・公共セクターの規制(PCI DSS / HIPAA / FedRAMP)では、リソース作成者の管理・設定の統制・変更履歴が必須。Service Catalog で全デプロイメントを一元管理。
課題 4:マルチアカウント環境でのポリシー配布
数十~数百アカウント環境で、各アカウントに同じ「標準リソース設定」を配置する必要があり、手動では困難。Service Catalog を Organizations で共有。
主な特徴
| 特徴 | 詳細 |
|---|---|
| ポートフォリオ | 製品のコレクション(例:「データエンジニアリング基盤」) |
| 製品(Product) | CloudFormation / Terraform テンプレートの共有可能なパッケージ |
| 制約(Constraints) | デプロイ時の IAM ロール・パラメータ制限 / 通知 |
| バージョン管理 | 製品のバージョン(v1.0 / v1.1 / v2.0)を管理、段階的アップグレード可能 |
| エンドユーザー権限制御 | ポートフォリオ共有で、特定ユーザー / グループのみアクセス可能 |
| セルフサービス | 開発者が直接デプロイ、IT 部門の介入不要 |
| AppRegistry 統合 | デプロイされたリソースをアプリケーション単位で一元管理 |
| 監査ログ | CloudTrail / Service Catalog API で全デプロイメント記録 |
| CloudFormation Hooks | デプロイ前のコンプライアンス自動チェック |
| 無料サービス | API オペレーション・プロビジョニング製品時間で課金 |
アーキテクチャと基本概念
graph TB
Admin["IT 管理者"]
CloudFormation["CloudFormation<br/>テンプレート"]
Terraform["Terraform<br/>HCL"]
Admin --> |製品作成| Portfolio["ポートフォリオ<br/>(製品カタログ)"]
CloudFormation --> |テンプレート登録| Portfolio
Terraform --> |テンプレート登録| Portfolio
Portfolio --> |制約(Constraints)| ConstraintLayer["制約レイヤー<br/>・Launch IAM Role<br/>・Template Parameter制限<br/>・通知・Tag Options"]
ConstraintLayer --> |共有| Group["IAM グループ<br/>開発チーム"]
Group --> |セルフサービス| Catalog["Service Catalog<br/>ポータル"]
Catalog --> |製品展開| Deploy["リソース<br/>デプロイ"]
Deploy --> |一元管理| AppRegistry["AppRegistry<br/>アプリケーション<br/>管理"]
style Admin fill:#e6f3ff
style Portfolio fill:#fff3cd
style ConstraintLayer fill:#e6ffe6
style Catalog fill:#f3e6ff
style Deploy fill:#ffe6e6
コアコンポーネント詳解
1. ポートフォリオ(Portfolio)
複数の製品をグループ化し、特定ユーザーに共有するコンテナ。
ポートフォリオの例:
データエンジニアリング基盤
├─ S3 データレイク標準構成
├─ Athena クエリエンジン環境
├─ AWS Glue ETL ジョブ
└─ DynamoDB テーブル標準構成
Webアプリケーション基盤
├─ ECS コンテナクラスタ
├─ RDS PostgreSQL 本番構成
├─ Application Load Balancer
└─ CloudFront キャッシュ配布
2. 製品(Product)
CloudFormation / Terraform テンプレートをパッケージ化した単位。バージョン管理対応。
製品の構成要素:
- テンプレート:CloudFormation YAML / JSON、または Terraform HCL
- バージョン:v1.0 / v1.1 / v2.0 など(段階的更新対応)
- メタデータ:製品名、説明、所有者、サポート連絡先
- IAM ロール:デプロイ時に使用するロール
- パラメータ制約:エンドユーザーが変更可能な範囲
3. プロビジョニング済み製品(Provisioned Product)
ユーザーが Service Catalog から展開した実際のリソース(CloudFormation スタック)。
4. 制約(Constraints)
ポートフォリオの製品に対する制約。4 つのタイプがある:
制約タイプ 1:Launch 制約
デプロイ時の IAM ロールを固定、エンドユーザー権限をコントロール。
# 例:エンドユーザーは S3 バケット作成のパーミッション不要
# Service Catalog が指定 IAM ロールで代行実行
aws servicecatalog create-constraint \
--portfolio-id port-xxxxx \
--product-id prod-xxxxx \
--type LAUNCH \
--description "S3 バケット作成時の Launch ロール" \
--parameters '{
"RoleArn": "arn:aws:iam::123456789012:role/ServiceCatalogLaunchRole"
}'
制約タイプ 2:Template 制約
CloudFormation パラメータの許可値を制限。
# 例:EC2 インスタンスタイプを t3.small / t3.medium のみに限定
aws servicecatalog create-constraint \
--portfolio-id port-xxxxx \
--product-id prod-xxxxx \
--type TEMPLATE \
--parameters '{
"InstanceType": ["t3.small", "t3.medium"]
}'
制約タイプ 3:Notification 制約
デプロイメント時に SNS トピックで通知。
aws servicecatalog create-constraint \
--portfolio-id port-xxxxx \
--product-id prod-xxxxx \
--type NOTIFICATION \
--parameters '{
"NotificationArn": "arn:aws:sns:ap-northeast-1:123456789012:deployment-alerts"
}'
制約タイプ 4:Resource Update 制約
展開後の CloudFormation スタック更新を制限。
# 例:デプロイ後、エンドユーザーは更新不可
# IT 管理者のみ更新可能
aws servicecatalog create-constraint \
--portfolio-id port-xxxxx \
--product-id prod-xxxxx \
--type RESOURCE_UPDATE \
--parameters '{
"AllowedActions": ["Update", "Terminate"]
}'
5. Tag Options
リソースのタグを標準化。Service Catalog がデプロイ時に強制的にタグを付与。
# Tag Options グループ作成
aws servicecatalog create-tag-option \
--key "Environment" \
--value "Production" \
--active
# ポートフォリオに Tag Options を関連付け
aws servicecatalog associate-tag-option-with-resource \
--resource-id port-xxxxx \
--tag-option-id topt-xxxxx
ポートフォリオの設計
ポートフォリオ設計の 5 つのステップ
-
組織構造・チーム構成を分析
データエンジニアリングチーム → データ基盤ポートフォリオ Webアプリケーション開発チーム → アプリ基盤ポートフォリオ インフラ・DevOps チーム → インフラ基盤ポートフォリオ -
各チームの一般的ユースケース整理
データチーム: - S3 データレイク - Athena クエリ環境 - DynamoDB 分析テーブル -
CloudFormation / Terraform テンプレート準備
→ 既存テンプレート利用、または新規作成 → セキュリティ・ガバナンス要件を埋め込み -
制約(Constraints)の定義
Launch:IAM ロール Template:パラメータ制限 Notification:デプロイ通知 -
段階的展開・フィードバック反映
PoC → 小規模チーム試用 → 全社展開
ポートフォリオ共有方法
# IAM ユーザー / グループ に共有
aws servicecatalog associate-principal-with-portfolio \
--portfolio-id port-xxxxx \
--principal-arn "arn:aws:iam::123456789012:group/data-engineers" \
--principal-type IAM
# Organizations の OU に共有(マルチアカウント)
aws servicecatalog create-portfolio-share \
--portfolio-id port-xxxxx \
--organization-node-type "OU" \
--organization-node-value "ou-xxxx-yyyyyy"
製品(Product)の定義
CloudFormation テンプレート ベースの製品
# CloudFormation テンプレートを Product に変換
aws servicecatalog create-product \
--name "S3 データレイク標準構成" \
--description "暗号化・バージョニング・ライフサイクル設定済み S3 バケット" \
--product-type CLOUD_FORMATION_TEMPLATE \
--provisioning-artifact-parameters '{
"Name": "v1.0",
"Description": "初期リリース",
"Type": "CLOUD_FORMATION_TEMPLATE",
"Info": {
"LoadTemplateFromURL": "https://s3.amazonaws.com/my-cfn-templates/s3-datalake.yaml"
}
}' \
--owner "Platform Engineering Team" \
--support-description "support@company.com" \
--support-email "support@company.com" \
--support-url "https://wiki.company.com/aws-service-catalog"
Terraform テンプレート ベースの製品(2025~)
aws servicecatalog create-product \
--name "VPC ネットワーク標準構成" \
--description "Terraform で管理する VPC・Subnet・Route Table" \
--product-type TERRAFORM_MODULE \
--provisioning-artifact-parameters '{
"Name": "v2.0",
"Description": "Terraform 統合版",
"Type": "TERRAFORM_MODULE",
"Info": {
"LoadTemplateFromURL": "https://s3.amazonaws.com/terraform-modules/vpc-standard.tar.gz"
}
}'
製品バージョン管理
# 既存製品に新しいバージョンを追加
aws servicecatalog create-provisioning-artifact \
--product-id prod-xxxxx \
--parameters '{
"Name": "v2.0",
"Description": "新機能追加・バグ修正版",
"Type": "CLOUD_FORMATION_TEMPLATE",
"Info": {
"LoadTemplateFromURL": "https://s3.amazonaws.com/my-cfn-templates/s3-datalake-v2.yaml"
}
}'
# 古いバージョンを非推奨化
aws servicecatalog deprecate-provisioning-artifact \
--product-id prod-xxxxx \
--provisioning-artifact-id pa-oldversion
制約(Constraints)詳解
Launch 制約の実装例
# 開発環境:最小限の IAM ロール
# 本番環境:厳格な IAM ロール
# 開発ポートフォリオ用制約
aws servicecatalog create-constraint \
--portfolio-id port-dev \
--product-id prod-ec2-instance \
--type LAUNCH \
--parameters '{
"RoleArn": "arn:aws:iam::123456789012:role/ServiceCatalogLaunchRole-Dev"
}'
# 本番ポートフォリオ用制約
aws servicecatalog create-constraint \
--portfolio-id port-prod \
--product-id prod-ec2-instance \
--type LAUNCH \
--parameters '{
"RoleArn": "arn:aws:iam::123456789012:role/ServiceCatalogLaunchRole-Prod"
}'
Template 制約の例
# RDS インスタンスタイプを制限
aws servicecatalog create-constraint \
--portfolio-id port-xxxxx \
--product-id prod-rds-mysql \
--type TEMPLATE \
--parameters '{
"DBInstanceClass": [
"db.t3.micro",
"db.t3.small",
"db.t3.medium"
],
"AllocatedStorage": {
"min": "20",
"max": "1000"
}
}'
# EC2 インスタンスタイプ・AMI を制限
aws servicecatalog create-constraint \
--portfolio-id port-xxxxx \
--product-id prod-ec2-instance \
--type TEMPLATE \
--parameters '{
"InstanceType": [
"t3.small",
"t3.medium",
"m5.large"
],
"ImageId": [
"ami-company-ubuntu-22-lts"
]
}'
エンドユーザーの製品展開
セルフサービスポータルへのアクセス
# エンドユーザーが利用可能なポートフォリオ・製品を検索
aws servicecatalog search-products-as-end-user \
--query 'ProductViewDetails[*].ProductViewSummary.{Name: Name, ProductId: ProductId}' \
--output table
# 製品の詳細を確認
aws servicecatalog describe-product-as-end-user \
--product-id prod-xxxxx
製品のプロビジョニング(展開)
# 製品を展開
aws servicecatalog provision-product \
--product-name "S3 データレイク標準構成" \
--provisioning-artifact-name "v1.0" \
--provisioned-product-name "my-team-datalake-prod" \
--provisioning-parameters '[
{
"Key": "BucketName",
"Value": "my-team-datalake"
},
{
"Key": "Environment",
"Value": "production"
},
{
"Key": "DataRetentionDays",
"Value": "90"
}
]'
# 応答
{
"RecordDetail": {
"RecordId": "rec-xxxxx",
"ProvisionedProductId": "pp-xxxxx",
"Status": "PROVISIONING",
"CreatedTime": "2024-04-26T10:00:00Z"
}
}
展開済み製品の一覧・管理
# プロビジョニング済み製品を一覧表示
aws servicecatalog list-provisioned-products \
--query 'ProvisionedProducts[*].{Id: Id, Name: Name, Status: Status}' \
--output table
# 製品の詳細を確認
aws servicecatalog describe-provisioned-product \
--provisioned-product-id pp-xxxxx
# 製品を新しいバージョンへアップグレード
aws servicecatalog update-provisioned-product \
--provisioned-product-id pp-xxxxx \
--provisioning-artifact-name "v2.0"
# 製品を削除(TerminateProvisionedProduct)
aws servicecatalog terminate-provisioned-product \
--provisioned-product-id pp-xxxxx
AppRegistry との統合
Service Catalog でデプロイされたリソースを AppRegistry で一元管理。
AppRegistry への登録
# アプリケーションを定義
aws servicecatalog-appregistry create-application \
--name "payment-system" \
--description "支払い処理システム"
# リソースグループを作成
aws resource-groups create-group \
--name "payment-system-resources" \
--resource-query '{
"Type": "TAG_FILTERS_1_0",
"Query": "tag:Application=payment-system"
}'
# Service Catalog でデプロイ時に Application タグを自動付与
# → AppRegistry が自動的に CloudFormation スタックを追跡
Application Insights での監視
# AppRegistry の Application から Application Insights を有効化
aws application-insights create-application \
--resource-group-name "payment-system-resources" \
--ops-center-enabled \
--ops-item-sns-topic-arn "arn:aws:sns:ap-northeast-1:123456789012:app-alerts"
Control Tower Account Factory との連携
Account Factory は Service Catalog 製品として実装。新規 AWS アカウントの自動プロビジョニング。
Account Factory の使用
# Control Tower から Account Factory 製品を検索
# AWS Console → Control Tower → Account Factory
# または API で
aws servicecatalog provision-product \
--product-name "AWS Account" \
--provisioned-product-name "development-account-001" \
--provisioning-parameters '[
{
"Key": "AccountEmail",
"Value": "dev-team@company.com"
},
{
"Key": "AccountName",
"Value": "development-001"
},
{
"Key": "OrganizationalUnitName",
"Value": "Development"
},
{
"Key": "ManagedOrganizationalUnit",
"Value": "ou-dev-xxxxx"
}
]'
Account Factory Customization (AFC)
Terraform / CDK で Account Factory をカスタマイズ。
# AFC リポジトリから Terraform モジュール作成
# → Service Catalog 製品として登録
# → デプロイ時にカスタムロジック実行
Terraform 統合
Terraform モジュールを Service Catalog 製品化
# Terraform モジュールのディレクトリ構造
my-terraform-module/
├── main.tf
├── variables.tf
├── outputs.tf
└── README.md
# S3 にアップロード
aws s3 cp my-terraform-module s3://service-catalog-templates/vpc-standard.tar.gz
# Service Catalog 製品として登録
aws servicecatalog create-product \
--name "VPC ネットワーク(Terraform)" \
--product-type TERRAFORM_MODULE \
--provisioning-artifact-parameters '{
"Name": "v1.0",
"Type": "TERRAFORM_MODULE",
"Info": {
"LoadTemplateFromURL": "s3://service-catalog-templates/vpc-standard.tar.gz"
}
}'
設定・操作の具体例
ポートフォリオ・製品・制約の完全セットアップ
#!/bin/bash
# 1. ポートフォリオ作成
PORTFOLIO_ID=$(aws servicecatalog create-portfolio \
--display-name "データエンジニアリング基盤" \
--description "S3/Athena/DynamoDB 標準構成セット" \
--provider-name "Platform Engineering" \
--query 'PortfolioDetail.Id' \
--output text)
echo "Created Portfolio: $PORTFOLIO_ID"
# 2. CloudFormation テンプレートから製品を作成
PRODUCT_ID=$(aws servicecatalog create-product \
--name "S3 データレイク標準構成" \
--description "暗号化・バージョニング設定済み S3 バケット" \
--product-type CLOUD_FORMATION_TEMPLATE \
--provisioning-artifact-parameters '{
"Name": "v1.0",
"Type": "CLOUD_FORMATION_TEMPLATE",
"Info": {
"LoadTemplateFromURL": "https://s3.amazonaws.com/cfn-templates/s3-datalake.yaml"
}
}' \
--owner "Platform Team" \
--query 'ProductViewDetail.ProductViewSummary.ProductId' \
--output text)
echo "Created Product: $PRODUCT_ID"
# 3. 製品をポートフォリオに追加
aws servicecatalog associate-product-with-portfolio \
--product-id $PRODUCT_ID \
--portfolio-id $PORTFOLIO_ID
# 4. Launch 制約(IAM ロール)を作成
aws servicecatalog create-constraint \
--portfolio-id $PORTFOLIO_ID \
--product-id $PRODUCT_ID \
--type LAUNCH \
--parameters '{
"RoleArn": "arn:aws:iam::123456789012:role/ServiceCatalogLaunchRole"
}'
# 5. Template 制約(パラメータ制限)を作成
aws servicecatalog create-constraint \
--portfolio-id $PORTFOLIO_ID \
--product-id $PRODUCT_ID \
--type TEMPLATE \
--parameters '{
"BucketVersioning": ["Enabled"],
"EncryptionType": ["AES256", "aws:kms"]
}'
# 6. Tag Options を作成・関連付け
TAG_OPTION_ID=$(aws servicecatalog create-tag-option \
--key "Environment" \
--value "Production" \
--active \
--query 'TagOptionDetail.Id' \
--output text)
aws servicecatalog associate-tag-option-with-resource \
--resource-id $PORTFOLIO_ID \
--tag-option-id $TAG_OPTION_ID
# 7. ポートフォリオをグループに共有
aws servicecatalog associate-principal-with-portfolio \
--portfolio-id $PORTFOLIO_ID \
--principal-arn "arn:aws:iam::123456789012:group/data-engineers" \
--principal-type IAM
echo "Setup complete!"
echo "Portfolio: $PORTFOLIO_ID"
echo "Product: $PRODUCT_ID"
CLI / SDK / IaC
AWS CDK での定義
from aws_cdk import (
core,
servicecatalog,
iam,
s3
)
class ServiceCatalogStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs):
super().__init__(scope, id, **kwargs)
# ポートフォリオ作成
portfolio = servicecatalog.Portfolio(
self, "DataEngineeringPortfolio",
display_name="Data Engineering Platform",
provider_name="Platform Team"
)
# CloudFormation テンプレート
template_bucket = s3.Bucket.from_bucket_name(
self, "TemplateBucket",
bucket_name="my-cfn-templates"
)
# 製品を定義
product = servicecatalog.CloudFormationProduct(
self, "S3DataLakeProduct",
product_name="S3 Data Lake Standard Config",
owner="Platform Team",
product_versions=[
servicecatalog.CloudFormationProductVersion(
cloud_formation_template=servicecatalog.CloudFormationTemplate.from_url(
"https://s3.amazonaws.com/my-cfn-templates/s3-datalake.yaml"
),
product_version_name="v1.0"
)
]
)
# ポートフォリオに製品を追加
portfolio.add_product(product)
# Launch 制約
launch_role = iam.Role(
self, "LaunchRole",
assumed_by=iam.ServicePrincipal("servicecatalog.amazonaws.com")
)
portfolio.add_product(
product,
create_launch_role_constraint=servicecatalog.CreateLaunchRoleConstraintOptions(
role=launch_role
)
)
# グループに共有
portfolio.give_access_to_group(
iam.Group.from_group_name(
self, "DataEngineers",
group_name="data-engineers"
)
)
Terraform での定義
resource "aws_servicecatalog_portfolio" "data_platform" {
name = "Data Engineering Platform"
description = "S3/Athena/DynamoDB standard configurations"
provider_name = "Platform Team"
}
resource "aws_servicecatalog_product" "s3_datalake" {
name = "S3 Data Lake Standard Config"
owner = "Platform Team"
type = "CLOUD_FORMATION_TEMPLATE"
provisioning_artifact_parameters {
name = "v1.0"
description = "Initial release"
type = "CLOUD_FORMATION_TEMPLATE"
template_url = "https://s3.amazonaws.com/my-cfn-templates/s3-datalake.yaml"
}
}
resource "aws_servicecatalog_portfolio_product_association" "associate" {
portfolio_id = aws_servicecatalog_portfolio.data_platform.id
product_id = aws_servicecatalog_product.s3_datalake.id
}
resource "aws_servicecatalog_constraint" "launch" {
portfolio_id = aws_servicecatalog_portfolio.data_platform.id
product_id = aws_servicecatalog_product.s3_datalake.id
type = "LAUNCH"
parameters = jsonencode({
RoleArn = aws_iam_role.launch.arn
})
}
CloudFormation での定義
Resources:
DataPlatformPortfolio:
Type: AWS::ServiceCatalog::Portfolio
Properties:
DisplayName: "Data Engineering Platform"
ProviderName: "Platform Team"
Description: "S3/Athena standard configurations"
S3DataLakeProduct:
Type: AWS::ServiceCatalog::CloudFormationProduct
Properties:
Name: "S3 Data Lake Standard Config"
Owner: "Platform Team"
ProvisioningArtifactParameters:
- Name: "v1.0"
Type: CLOUD_FORMATION_TEMPLATE
TemplateUrl: "https://s3.amazonaws.com/my-cfn-templates/s3-datalake.yaml"
ProductPortfolioAssociation:
Type: AWS::ServiceCatalog::PortfolioProductAssociation
Properties:
PortfolioId: !Ref DataPlatformPortfolio
ProductId: !Ref S3DataLakeProduct
LaunchConstraint:
Type: AWS::ServiceCatalog::ResourceUpdateConstraint
Properties:
PortfolioId: !Ref DataPlatformPortfolio
ProductId: !Ref S3DataLakeProduct
Type: LAUNCH
Parameters:
RoleArn: !GetAtt LaunchRole.Arn
LaunchRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: servicecatalog.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AdministratorAccess
Hashicorp Terraform との比較
| 観点 | AWS Service Catalog | Terraform Cloud / Enterprise |
|---|---|---|
| 対象 | AWS リソース | マルチクラウド(AWS / Azure / GCP) |
| 主な用途 | AWS リソースの承認済み展開 | インフラ全体の管理・自動化 |
| テンプレート言語 | CloudFormation YAML / Terraform HCL | Terraform HCL |
| バージョン管理 | Product のバージョン | Terraform Registry でのバージョン |
| 制約機能 | Launch / Template / Notification / Resource Update | Sentinel ポリシー |
| 権限制御 | Launch IAM ロール | Terraform Cloud / Enterprise のロール |
| 組織管理 | AWS Organizations 統合 | Terraform Organization |
| 複雑度 | 中(AWS 専用) | 高(マルチクラウド) |
| 学習曲線 | CloudFormation 知識 | HCL 学習が必要 |
| 採用シーン | AWS 環境内のセルフサービス | マルチクラウド統合基盤 |
AWS Proton との比較
| 観点 | AWS Service Catalog | AWS Proton |
|---|---|---|
| 対象 | CloudFormation / Terraform テンプレート | アプリケーション・インフラストラクチャテンプレート |
| 主な用途 | リソースのセルフサービス展開 | エンドツーエンドアプリケーション展開 |
| テンプレート | リソース単位 | アプリ・インフラ統合テンプレート |
| CI/CD 統合 | 限定的 | 深い統合(CodePipeline / GitOps) |
| 監視 | AppRegistry 連携 | 組み込みダッシュボード |
| 複雑度 | 低~中 | 高(完全なアプリケーション管理) |
| 採用シーン | ガバナンス・セルフサービス | DevOps パイプライン統合 |
ベストプラクティス
✅ やるべきこと
-
ポートフォリオはチーム・機能単位で設計
データエンジニアリング → 1 ポートフォリオ Webアプリ開発 → 1 ポートフォリオ インフラ基盤 → 1 ポートフォリオ -
製品テンプレートには IT ガバナンス要件を埋め込み
✅ デフォルト タグ(Environment / CostCenter / Owner) ✅ 暗号化(S3 / RDS / EBS) ✅ バックアップ設定 ✅ ネットワーク隔離(VPC / セキュリティグループ) -
Launch 制約で IAM ロール管理
開発環境:最小権限ロール 本番環境:厳格なコンプライアンスロール -
Template 制約でパラメータを制限
✅ インスタンスタイプの許可値を限定 ✅ ストレージサイズの上限設定 ✅ 環境値を固定(本番のみ複製対応 etc) -
AppRegistry で一元管理
Service Catalog 製品 → AppRegistry アプリケーション → Application Insights で監視 -
定期的なテンプレートレビュー・バージョンアップ
6 ヶ月ごと:セキュリティパッチ・機能追加版リリース 段階的: v1.0 推奨 → v1.1 オプション → v2.0 推奨に昇格
❌ やってはいけないこと
-
ポートフォリオを過度に大きくする
1 ポートフォリオに 100+ 製品 → 管理困難 デジタル化された「商品カテゴリ」単位で分割 -
テンプレートにハードコード値を埋め込む
❌ BucketName: "my-company-datalake-prod"(固定) ✅ BucketName: パラメータで指定 -
制約なしでテンプレート配布
エンドユーザーが任意に設定可能 → ガバナンス喪失 必ず Launch / Template 制約を設定 -
Cloud Formation フックの無視
CloudFormation Hooks でコンプライアンスチェック可能 → Template 検証の自動化 -
監査・ログ記録なし
CloudTrail で全デプロイメント記録 定期的な監査レポート作成
トラブルシューティング
Issue 1:ユーザーが製品を見つけられない
# 原因確認
1. ポートフォリオがユーザーに共有されているか
aws servicecatalog list-portfolios-for-product \
--product-id prod-xxxxx
2. ユーザーが正しいグループ に属しているか
aws iam get-group-members --group-name data-engineers
3. IAM ポリシーで servicecatalog:SearchProducts 権限があるか
aws iam get-user-policy --user-name user-name --policy-name servicecatalog-policy
Issue 2:製品デプロイが失敗する
# 原因確認
1. CloudFormation テンプレート自体が有効か
aws cloudformation validate-template \
--template-body file://s3-datalake.yaml
2. Launch ロールに必要な権限があるか
# S3 バケット作成権限、IAM ロール作成権限等を確認
3. テンプレート制約が厳しすぎないか
# パラメータの許可値を確認
4. CloudFormation スタック作成ログを確認
aws cloudformation describe-stack-events \
--stack-name <CloudFormation Stack Name> \
--query 'StackEvents[0:10]'
Issue 3:デプロイ後にリソースが変更できない
# 原因確認
1. Resource Update 制約が設定されているか
aws servicecatalog describe-constraints \
--portfolio-id port-xxxxx \
--product-id prod-xxxxx \
--query 'Constraints[?Type==`RESOURCE_UPDATE`]'
2. CloudFormation Stack Policy で更新禁止か
aws cloudformation get-stack-policy \
--stack-name <Stack Name>
2025-2026 最新動向
1. ビジュアルポートフォリオエディタ(2025)
AWS Console でドラッグ&ドロップで製品管理可能に。
2. CloudFormation Hooks 統合
デプロイ前のコンプライアンス自動チェック。
aws servicecatalog create-constraint \
--portfolio-id port-xxxxx \
--product-id prod-xxxxx \
--type TEMPLATE_VALIDATION \
--parameters '{
"CloudFormationHookConfiguration": {
"Properties": {
"s3_bucket_encryption": "required",
"logging_enabled": "required"
}
}
}'
3. Terraform 完全統合(2025~2026)
Terraform モジュールのネイティブサポート拡張。
4. AI による制約推奨
セキュリティ・コスト最適化の自動提案。
5. マルチリージョン製品配布
1 回のデプロイで複数リージョンに自動展開。
学習リソース・参考文献
AWS 公式資料
- AWS Service Catalog User Guide
- Service Catalog Constraints Documentation
- AppRegistry Integration Guide
AWS ブログ・ベストプラクティス
サードパーティ・OSS
実装例・活用シーン
シーン 1:金融機関の PCI DSS 準拠
PCI Compliant ポートフォリオ
├─ 暗号化 RDS(必須)
├─ VPC ネットワーク(隔離必須)
├─ CloudTrail ログ(監査用)
└─ IAM ロール(権限分離)
→ エンドユーザーはパラメータを変更できない
→ IT 部門が定期的に監査レポート生成
シーン 2:マルチアカウント環境の標準化
Control Tower ランディングゾーン
↓
Account Factory(Service Catalog 製品)でアカウント作成
↓
各アカウント内に Service Catalog ポートフォリオ配布
↓
開発者が標準化されたリソースをセルフサービスで展開
シーン 3:スタートアップの迅速な環境構築
Startup Portfolio
├─ Web App スタック(ECS + RDS + CloudFront)
├─ バッチ処理スタック(Lambda + SQS + S3)
└─ 分析スタック(Athena + Glue + QuickSight)
新規プロジェクト開始時に、テンプレートを選んで 30 分で環境構築完了
スケーリング・マルチアカウント
Organizations でのポートフォリオ共有
# 本社OU にポートフォリオを共有
aws servicecatalog create-portfolio-share \
--portfolio-id port-xxxxx \
--organization-node-type ORGANIZATION_ROOT \
--accept-language "ja"
# 特定 OU(部門)に限定して共有
aws servicecatalog create-portfolio-share \
--portfolio-id port-xxxxx \
--organization-node-type ORGANIZATIONAL_UNIT \
--organization-node-value "ou-engineering-xxxxx"
大規模組織での ポートフォリオ管理戦略
グローバル本社(マスター)
├─ グローバル基盤ポートフォリオ(全社必須)
アジア太平洋地域
├─ APAC データセンター ポートフォリオ
日本法人
├─ 日本ローカル規制対応ポートフォリオ
各事業部
├─ 事業部固有 ポートフォリオ
セキュリティ・IAM
Service Catalog 管理者 IAM ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"servicecatalog:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"cloudformation:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": "arn:aws:iam::123456789012:role/ServiceCatalog*"
}
]
}
エンドユーザー IAM ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"servicecatalog:DescribeProduct",
"servicecatalog:SearchProducts",
"servicecatalog:ProvisionProduct",
"servicecatalog:DescribeProvisionedProduct",
"servicecatalog:TerminateProvisionedProduct",
"servicecatalog:UpdateProvisionedProduct"
],
"Resource": "*"
}
]
}
監視・コンプライアンス
CloudTrail でのデプロイメント監査
# Service Catalog API 呼び出しをログに記録
# CloudTrail → CloudWatch Logs → 分析
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=ProvisionProduct \
--start-time 2024-01-01T00:00:00Z
AWS Config との連携
Service Catalog でデプロイされたリソースのコンプライアンス監視。
チェックリスト
- [ ] ポートフォリオが組織構造・チーム単位で設計されているか
- [ ] CloudFormation / Terraform テンプレートが完成・テスト済みか
- [ ] 製品が「承認済み設定」を埋め込んでいるか
- [ ] Launch 制約(IAM ロール)が設定されているか
- [ ] Template 制約(パラメータ制限)が設定されているか
- [ ] Notification 制約でアラートが設定されているか
- [ ] Tag Options でタグ標準化が実装されているか
- [ ] AppRegistry でアプリケーション一元管理がセットアップされているか
- [ ] IAM ポリシーで権限が適切に制限されているか
- [ ] CloudTrail で監査ログが記録されているか
- [ ] 非本番環境でテスト済みか
- [ ] 定期的なテンプレートレビュー・バージョン更新スケジュール設定済みか
まとめ
AWS Service Catalog は 「承認済み AWS リソースのセルフサービスポータル。IT ガバナンスと開発生産性の両立」。IT 管理者が CloudFormation / Terraform テンプレートを製品化し、制約(Launch / Template / Notification)でパラメータ・権限・タグを統制。エンドユーザーは承認済み構成のみを選択してセルフサービスでデプロイ。
採用メリット:
- ガバナンス:タグ・セキュリティ設定の強制
- 生産性:ワンクリック環境構築
- 監査:全デプロイメント履歴を CloudTrail 記録
- スケーラビリティ:マルチアカウント環境での一元管理(Organizations 統合)
- コンプライアンス:PCI DSS / HIPAA 等規制要件への対応
設計のコツ:
- ポートフォリオを機能・チーム単位に分割(過度の大規模化を避ける)
- テンプレートにガバナンス要件(タグ・暗号化・バックアップ)を埋め込み
- Launch 制約で IAM ロール制御(環境別に異なるロール)
- Template 制約でパラメータ制限(許可値の指定)
- AppRegistry で一元管理・監視
Service Catalog は、エンタープライズ組織での AWS ガバナンス・セルフサービス実装のベストプラクティス。Control Tower・Organizations・AppRegistry と統合することで、数百~数千アカウント規模のマルチアカウント環境でのスケーラブルな運用が実現できます。
最終更新:2026-04-26
バージョン:v2.0