Service Catalogの製品タイプにTERRAFORM_OPEN_SOURCEが追加されたので試してみた

Service Catalogの製品タイプにTERRAFORM_OPEN_SOURCEが追加されて、Terraformコードから製品を作成することができるようになったので試してみます。
2023.04.05

AWS事業本部コンサルティング部のイシザワです。

最近のアップデートでTerraformで書かれたコードをService Catalogの製品として起動できるようになりました。

本記事では公式のGetting startedを参考に、製品を起動するまでの流れを確かめたいと思います。

やってみた

Terraform Reference Engineのプロビジョニング

まずは製品を登録する管理アカウントにTerraform Reference Engineをデプロイする必要があります。

今回はCloud9上でコマンドを実行してプロビジョニングをします。現時点のCloud9には動作要件のPython3.9が入っていないので先にPython3.9をインストールする必要があります。

参考) 【AWS】素の Cloud9 に Python 3.9 をインストールする

他にもjqが必要なのでインストールします。

$ sudo yum install jq -y

Python3.9とjqがインストールされたら、以下のコマンドを実行してインストールスクリプトを実行します。

$ git clone https://github.com/aws-samples/service-catalog-engine-for-terraform-os.git
$ cd service-catalog-engine-for-terraform-os
$ ./bin/bash/deploy-tre.sh -r ap-northeast-1

スクリプトの実行が完了すると、以下のようにスタックSAM-TREBootstrap-TREがデプロイされていることが確認できます。

製品の登録

このページにあるsimple-s3-bucket.tar.gzを製品として登録します。

「Service Catalog > 製品リスト > 製品を作成」で製品の作成を行います。以下の設定で製品を作成します。指定の無い項目は空欄でOKです。

項目名
製品タイプ Terraform のオープンソース
製品名 Simple S3 Bucket
所有者 <適当な値>
バージョンソース テンプレートファイルをアップロード(simple-s3-bucket.tar.gzをアップロード)
バージョン名 v1

続いてポートフォリオを作成します。 「Service Catalog > ポートフォリオ > ポートフォリオの作成」で以下の設定のポートフォリオを作成します。

項目名
ポートフォリオ名 S3 Bucket
所有者 <適当な値>

作成したポートフォリオに製品「Simple S3 Bucket」を追加します。追加する際に「起動制約を今すぐ作成する」のチェックを外します。

起動制約の設定

以下のPolicyDocumentを持つIAMポリシーS3ResourceCreationAndArtifactAccessPolicyを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/servicecatalog:provisioning": "true"
                }
            }
        },
        {
            "Action": [
                "s3:CreateBucket*",
                "s3:DeleteBucket*",
                "s3:Get*",
                "s3:List*",
                "s3:PutBucketTagging"
            ],
            "Resource": "arn:aws:s3:::*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "resource-groups:CreateGroup",
                "resource-groups:ListGroupResources",
                "resource-groups:DeleteGroup",
                "resource-groups:Tag"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "tag:GetResources",
                "tag:GetTagKeys",
                "tag:GetTagValues",
                "tag:TagResources",
                "tag:UntagResources"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

上から順に

  • Service Catalogが製品テンプレートを取得するための権限
  • S3バケットをプロビジョニングするための権限
  • Service Catalogがリソースグループを操作するための権限
  • Service Catalogがタグを管理するための権限

となっています。

このIAMポリシーをアタッチした、起動制約用のIAMロールSCLaunch-S3productを作成します。ロール名は必ずSCLaunch-始まりでなければなりません。

このIAMロールの信頼ポリシーは以下のように設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GivePermissionsToServiceCatalog",
            "Effect": "Allow",
            "Principal": {
                "Service": "servicecatalog.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<管理アカウントのアカウントID>:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringLike": {
                    "aws:PrincipalArn": [
                        "arn:aws:iam::<管理アカウントのアカウントID>:role/TerraformEngine/TerraformExecutionRole*",
                        "arn:aws:iam::<管理アカウントのアカウントID>:role/TerraformEngine/ServiceCatalogTerraformOSParameterParserRole*"
                    ]
                }
            }
        }
    ]
}

上から順に

  • Service Catalogへのアクセス許可
  • Terraform Reference Engineへのアクセス許可

となっています。

「Service Catalog > ポートフォリオ > S3 Bucket > 制約を作成」より起動制約の設定を行います。以下の設定で起動制約を作成します。

項目名
製品 Simple S3 Bucket
制約タイプ 起動
メソッド ロール名を入力
ロール名 SCLaunch-S3product

製品の起動

「Service Catalog > ポートフォリオ > S3 Bucket > アクセス権の付与」から、ポートフォリオのアクセス許可を設定します。製品を起動を許可するIAMプリンシパルを設定します。

アクセス権を設定したら「Service Catalog > 製品」で表示される製品の一覧に「Simple S3 Bucket」が追加されています。「Simple S3 Bucket」を選択して「製品を起動」をクリックすることで製品の起動設定を行います。

今回は以下の起動設定で製品を設定します。

項目名 備考
プロビジョニングされた製品の名前 <名前を生成にチェック>
製品バージョン v1
bucket_name test-simple-s3-bucket-<アカウントID> Terraformコードのパラメータ

起動の進行状況はStep FunctionsのステートマシンManageProvisionedProductStateMachineの「実行」から確認できます。

起動が完了するとプロビジョニングされた製品のリソースタブよりS3バケットが作成されたことが確認できます。Terraformで製品を作成した場合各種リソースはAWSリソースグループに追加されるようです。

出力にはTerraformコードで指定された出力とリソースグループのARNが表示されます。

製品の更新も行うこともできます。更新の際もステートマシンManageProvisionedProductStateMachineで更新の進行状況を確認することができます。

製品の削除

プロビジョニングされた製品のページより、製品の削除を行うことができます。ステートマシンTerminateProvisionedProductStateMachineで削除の進行状況を確認することができます。

CFnテンプレートから作成された製品との違い

製品タイプCLOUD_FORMATION_TEMPLATEの製品との違いを、今回の検証で気づいた範囲で列挙します。

  • 事前にTerraform Reference Engineのプロビジョニングが必要
  • テンプレートファイルを構成ファイル単体でなくtar.gzファイルで指定する
  • 起動制約の設定が必須
  • 現時点(2023/04/05)で起動制約以外の制約を適用することができない
  • 起動制約に設定するIAMロールに必須となる権限が増えている
    • リソースグループを操作するための権限が必須
  • 起動制約に設定するIAMロールの信頼性ポリシー
    • Service CatalogだけでなくTerraform Reference EngineからもAssumeRoleされる
  • 作成されたリソースがリソースグループに追加される

まとめ

TerraformのコードをService Catalogの製品として起動するまでの流れを確認しました。 公式のチュートリアルによると製品の共有も可能とのことなので、また別の機会に試してみたいと思います。