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-TRE
とBootstrap-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の製品として起動するまでの流れを確認しました。 公式のチュートリアルによると製品の共有も可能とのことなので、また別の機会に試してみたいと思います。