目次

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 による制約推奨:セキュリティ・コスト最適化の自動提案
  • ビジュアルポートフォリオ エディタ:ノーコードで製品管理可能に

目次

  1. 概要
  2. Service Catalog が解決する課題
  3. 主な特徴
  4. アーキテクチャと基本概念
  5. コアコンポーネント詳解
  6. ポートフォリオの設計
  7. 製品(Product)の定義
  8. 制約(Constraints)詳解
  9. エンドユーザーの製品展開
  10. AppRegistry との統合
  11. Control Tower Account Factory との連携
  12. Terraform 統合
  13. 設定・操作の具体例
  14. CLI / SDK / IaC
  15. Hashicorp Terraform との比較
  16. AWS Proton との比較
  17. ベストプラクティス
  18. トラブルシューティング
  19. 2025-2026 最新動向
  20. 学習リソース・参考文献
  21. 実装例・活用シーン
  22. スケーリング・マルチアカウント
  23. セキュリティ・IAM
  24. 監視・コンプライアンス
  25. チェックリスト
  26. まとめ
  27. 参考文献

概要

初心者向けメモ: 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 つのステップ

  1. 組織構造・チーム構成を分析

    データエンジニアリングチーム   → データ基盤ポートフォリオ
    Webアプリケーション開発チーム → アプリ基盤ポートフォリオ
    インフラ・DevOps チーム       → インフラ基盤ポートフォリオ
    
  2. 各チームの一般的ユースケース整理

    データチーム:
      - S3 データレイク
      - Athena クエリ環境
      - DynamoDB 分析テーブル
    
  3. CloudFormation / Terraform テンプレート準備

    → 既存テンプレート利用、または新規作成
    → セキュリティ・ガバナンス要件を埋め込み
    
  4. 制約(Constraints)の定義

    Launch:IAM ロール
    Template:パラメータ制限
    Notification:デプロイ通知
    
  5. 段階的展開・フィードバック反映

    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. ポートフォリオはチーム・機能単位で設計

    データエンジニアリング   → 1 ポートフォリオ
    Webアプリ開発 → 1 ポートフォリオ
    インフラ基盤 → 1 ポートフォリオ
    
  2. 製品テンプレートには IT ガバナンス要件を埋め込み

    ✅ デフォルト タグ(Environment / CostCenter / Owner)
    ✅ 暗号化(S3 / RDS / EBS)
    ✅ バックアップ設定
    ✅ ネットワーク隔離(VPC / セキュリティグループ)
    
  3. Launch 制約で IAM ロール管理

    開発環境:最小権限ロール
    本番環境:厳格なコンプライアンスロール
    
  4. Template 制約でパラメータを制限

    ✅ インスタンスタイプの許可値を限定
    ✅ ストレージサイズの上限設定
    ✅ 環境値を固定(本番のみ複製対応 etc)
    
  5. AppRegistry で一元管理

    Service Catalog 製品 → AppRegistry アプリケーション
    → Application Insights で監視
    
  6. 定期的なテンプレートレビュー・バージョンアップ

    6 ヶ月ごと:セキュリティパッチ・機能追加版リリース
    段階的: v1.0 推奨 → v1.1 オプション → v2.0 推奨に昇格
    

❌ やってはいけないこと

  1. ポートフォリオを過度に大きくする

    1 ポートフォリオに 100+ 製品 → 管理困難
    デジタル化された「商品カテゴリ」単位で分割
    
  2. テンプレートにハードコード値を埋め込む

    ❌ BucketName: "my-company-datalake-prod"(固定)
    ✅ BucketName: パラメータで指定
    
  3. 制約なしでテンプレート配布

    エンドユーザーが任意に設定可能 → ガバナンス喪失
    必ず Launch / Template 制約を設定
    
  4. Cloud Formation フックの無視

    CloudFormation Hooks でコンプライアンスチェック可能
    → Template 検証の自動化
    
  5. 監査・ログ記録なし

    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 ブログ・ベストプラクティス

サードパーティ・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 等規制要件への対応

設計のコツ:

  1. ポートフォリオを機能・チーム単位に分割(過度の大規模化を避ける)
  2. テンプレートにガバナンス要件(タグ・暗号化・バックアップ)を埋め込み
  3. Launch 制約で IAM ロール制御(環境別に異なるロール)
  4. Template 制約でパラメータ制限(許可値の指定)
  5. AppRegistry で一元管理・監視

Service Catalog は、エンタープライズ組織での AWS ガバナンス・セルフサービス実装のベストプラクティス。Control Tower・Organizations・AppRegistry と統合することで、数百~数千アカウント規模のマルチアカウント環境でのスケーラブルな運用が実現できます。


最終更新:2026-04-26
バージョン:v2.0