継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

組織内での AWS 利用のガバナンスとアジリティを向上させる『AWS Service Catalog』を使ってみる

タダです.

業務でマルチアカウントかつ多数の開発ベンダーの方々が利用する環境の運用において「AWS Service Catalog(以下,Service Catalog)」の利用場面があると思い,まずは「Service Catalog」の概要や利用方法を確認した後,マルチアカウントかつ多数の開発ベンダーの方々が利用する環境での「Service Catalog」を利用パターンを整理します.

はじめに

「Service Catalog」とは

Service Catalog」とは2つの特徴のあるサービスです.

  1. 組織内のインフラプロビジョニングをアジリティを効かせて対処ができるサービス
  2. ガバナンスを効かせながらチームやプロジェクトがセルフでプロビジョニングする仕組みを作ることが可能

以下が各種サービスに関する参考情報リソースです.

サービストップ aws.amazon.com

ドキュメント docs.aws.amazon.com

Black Belt Online Seminar

「Service Catalog」の利用メリット

Service Catalog」の利用メリットは,以下の通りです.

  • 組織内での AWS 利用を適切な権限を設定して環境をプロビジョニングが可能なことからより良い AWS 利用促進に寄与すること
    • 管理者視点では,利用者に適切な権限を設定してガバナンスを強化
    • 利用者視点では,適切な権限をもらった上で素早く自分たちで環境をプロビジョニングが可能

「Service Catalog」の用語

Service Catalog」の用語として以下のものがあります.

  • 製品 : CloudFormation テンプレートをパッケージ化したもの.
    • EC2 やストレージ,データベースなどの1つ以上の AWS リソースからなり,バージョン管理可能.
  • 制約 : 製品のデプロイ方法を制御.ポートフォリオごとに各製品に制約を追加.
    • テンプレート制約 : 製品を起動する時のユーザーが使用できるパラメータ(EC2 インスタンスタイプ等)を制限.
    • 起動制約 : 起動時にリソースをプロビジョニングするのに利用するロール.
    • 通知制約 : SNS トピックを使ってスタックのイベントに関する通知を受けることを可能にする.
  • ポートフォリオ: 製品の集合.ポートフォリオの単位でユーザーに製品の仕様を許可.
  • プロビジョニングされた製品 : 製品のインスタンス.

「Service Catalog」の利用可能なリージョン

2019年10月時点で「Service Catalog」の利用利用可能なリージョンは東京含め下記のリージョンで利用可能です.

「Service Catalog」の利用料金

Service Catalog」の利用料金はポートフォリオの数で決まります.1つのポートフォリオにつき1 か月あたり「$5」の固定料金です.

料金ページ aws.amazon.com

「Service Catalog」の利用

Service Catalog」の利用の仕方を下記のページを参考に進めていきます.

開始方法 docs.aws.amazon.com

1. 管理者および利用者への権限付与

まずは,「Service Catalog」の管理者と利用者への権限を設定します.管理者には,「AWSServiceCatalogAdminFullAccess」という管理ポリシーが用意されてますが,「AdministratorAccess」権限が付与されていれば追加の権限は不要です.もし,「AdministratorAccess」権限がなければ管理ポリシーに加え,下記のインラインポリシーも設定ください.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateKeyPair",
                "iam:AddRoleToInstanceProfile",
                "iam:AddUserToGroup",
                "iam:AttachGroupPolicy",
                "iam:CreateAccessKey",
                "iam:CreateGroup",
                "iam:CreateInstanceProfile",
                "iam:CreateLoginProfile",
                "iam:CreateRole",
                "iam:CreateUser",
                "iam:Get*",
                "iam:List*",
                "iam:PutRolePolicy",
                "iam:UpdateAssumeRolePolicy"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

利用者には「ServiceCatalogEndUserAccess」をアタッチします.利用者の権限には,インラインポリシーとしてProvisionProductアクションを付与する必要があります.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "servicecatalog:ProvisionProduct"
            ],
            "Resource": "*"
        }
    ]
}

ドキュメントリンク

管理者へのアクセス権限の付与 docs.aws.amazon.com

利用者へのアクセス権限の付与 docs.aws.amazon.com

2. ポートフォリオの作成

ポートフォリオを作っていきます.ポートフォリオの作成はサービストップ画面の「今すぐ始める」からスタートします. f:id:sadayoshi_tada:20191022100700p:plain f:id:sadayoshi_tada:20191022100715p:plain

ポートフォリオの作成が完了すると,以下の様な状態になります. f:id:sadayoshi_tada:20191022100647p:plain

3. 製品を作成する

ポートフォリオを作れば製品を追加する準備が整うので,Amazon Linux の開発環境を作るための「Linux Desktop」という製品を作ります.ドキュメントの指示に従って設定を入力します. f:id:sadayoshi_tada:20191022131108p:plain f:id:sadayoshi_tada:20191022131132p:plain f:id:sadayoshi_tada:20191022131152p:plain f:id:sadayoshi_tada:20191022131200p:plain

4. テンプレートに制約を追加

CloudFormation テンプレートに利用者の制約を追加していきます.以下のルールでLinux サーバーを起動する時にt2.microt2.smallインスタンスしか選択できない様制約を設定します.

{
  "Rules": {
    "Rule1": {
      "Assertions": [
        {
          "Assert" : {"Fn::Contains": [["t2.micro", "t2.small"], {"Ref": "InstanceType"}]},
          "AssertDescription": "Instance type should be t2.micro or t2.small"
        }
      ]
    }
  }
}

5. 起動制約を追加する

起動制約は利用者が製品を起動するときに IAM が引き受ける Service Catalog ロールを指定します.利用者が CloudFormation を使える様に テンプレート起動制約を追加します.以下の IAM ポリシーを設定し,IAMロールとして Service Catalogを選択して設定します.

{
    "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": "*"
        }
    ]
}

6. 利用者での動作確認

利用者の IAM ユーザーでログインし,「Service Catalog」でテンプレートを起動できるかを確認します. f:id:sadayoshi_tada:20191022133743p:plain

利用者の画面から作成した「Linux Desktop」が確認できます.起動するとインスタンスタイプはt2.microt2.smallしか選べない様になっており制約も効いています. f:id:sadayoshi_tada:20191022133748p:plain f:id:sadayoshi_tada:20191022133751p:plain f:id:sadayoshi_tada:20191022133756p:plain f:id:sadayoshi_tada:20191022133759p:plain f:id:sadayoshi_tada:20191022133802p:plain f:id:sadayoshi_tada:20191022133806p:plain

利用者の CloudFormation テンプレート起動が成功しました. f:id:sadayoshi_tada:20191022133810p:plain f:id:sadayoshi_tada:20191022133813p:plain

マルチアカウントでの「Service Catalog」の利用シーン

マルチアカウントでの「Service Catalog」の利用シーンについて下記の資料のアーキテクチャパターンを整理したいと思います.

Case1. Hub-Spoke パターン(マスターアカウントから各アカウントへのポートフォリオの共有)

マスターアカウントで製品を一元管理し,各アカウントにポートフォリオをコピーする利用です.一番ベーシックなパターンかと思います.CloudFormation テンプレートの制約はマスターアカウントでの設定が引き継がれ,各アカウントのポートフォリオに追加のテンプレート制約も設定可能です.

Case2. CI/CD

事例のページに記載がありますが,CI/CDパターンが紹介されていました.マルチアカウントでのステージングを構成する場合のプロビジョニング構成方法として参考になります.

まとめ

Service Catalog」のサービス概要およびマルチアカウントでの利用シーンを整理しました.今やマルチアカウントでの運用も増え,「AWS Organaizations 」と組み合わせて管理者に依存しない環境のプロビジョニングが開発のアジリティを高めていくことはビジネス成長に寄与すると思います.利用シーンが合えばサービス利用を検討していきたいところです.また,下記のリポジトリには「Service Catalog」で使うテンプレートが入っているので参考にするのもの良いでしょう.

AWS Organizations で使用できる AWS のサービス docs.aws.amazon.com

awslabs/aws-service-catalog-products github.com