Terraform を使用して、シークレットを作成および管理できます。このトピックでは、シークレットの作成方法を説明します。
概要
Key Management Service (KMS) は、指定されたキーでシークレットを暗号化することによってシークレットを保護します。したがって、シークレットを作成する前にキーを作成する必要があります。シークレットの詳細については、「シークレット管理の概要」をご参照ください。
このトピックのサンプルコードは、ワンクリックで実行できます。コードを実行
前提条件
すべてのリソースに対する完全な権限を持つ Alibaba Cloud アカウントを使用すると、その認証情報が漏洩した場合に高いセキュリティリスクが生じます。セキュリティのベストプラクティスとして、RAM ユーザーを使用し、その RAM ユーザーの AccessKey ペアを作成します。詳細については、「RAM ユーザーの作成」および「AccessKey の作成」をご参照ください。
RAM ユーザーに、KMS を管理するための AliyunKMSFullAccess 権限と、Resource Access Management (RAM) を管理するための AliyunRAMFullAccess 権限を付与します。詳細については、「RAM ユーザーへの権限付与」をご参照ください。
{ "Version": "1", "Statement": [ { "Action": "kms:*", "Resource": "*", "Effect": "Allow" }, { "Action": "ram:CreateServiceLinkedRole", "Condition": { "StringEquals": { "ram:ServiceName": [ "secretsmanager-rds.kms.aliyuncs.com", "keystore.kms.aliyuncs.com" ] } }, "Resource": "*", "Effect": "Allow" } ] }Terraform のランタイム環境を準備します。Terraform は、次のいずれかの方法で使用できます。
Terraform Explorer で Terraform を使用する:Alibaba Cloud は、ログイン後に使用できるオンラインの Terraform 環境を提供します。インストールは不要です。この方法は、コストをかけずに Terraform を迅速にテストおよびデバッグするのに適しています。
Terraform を使用してリソースを迅速に作成する:Terraform は Alibaba Cloud Shell にプリインストールされており、認証情報も自動的に設定されます。Cloud Shell で Terraform コマンドを直接実行できます。この方法は、迅速、便利、かつ低コストで Terraform にアクセスして使用するのに適しています。
Terraform をローカルにインストールして設定する:この方法は、ネットワーク接続が不安定な場合や、カスタム開発環境が必要な場合に適しています。
Terraform のバージョンが v0.12.28 以降であることを確認してください。バージョンを確認するには、terraform --version コマンドを実行します。
使用するリソース
alicloud_kms_secret:シークレットを作成および管理します。
alicloud_vpc:Virtual Private Cloud (VPC) を作成します。
alicloud_vswitch:vSwitch を作成して、VPC を 1 つ以上のサブネットに分割します。
alicloud_kms_instance:KMS ソフトウェアキー管理インスタンスを購入して有効化します。
alicloud_kms_key:キーを作成および管理します。
alicloud_kms_alias:エイリアスを作成および管理します。
Terraform を使用したシークレットの作成
機密性の高いシークレット値がログやコンソールに表示されるのを防ぐために、secret_data 引数に sensitive = true を設定することを推奨します。詳細については、「Protect Sensitive Input Variables」をご参照ください。
この例では、汎用シークレットの作成方法を説明します。
作業ディレクトリを作成し、そのディレクトリに
main.tfという名前の設定ファイルを作成します。次の内容を
main.tfに追加します。KMS インスタンスとキーがすでに作成されていることを確認してください。重要シークレット値の暗号化に使用するキーは、対称キーである必要があります。
KMS インスタンスの作成:
variable "region" { default = "cn-heyuan" } provider "alicloud" { region = var.region } variable "instance_name" { default = "tf-kms-vpc-172-16" } # VPC を作成します。 resource "alicloud_vpc" "vpc" { vpc_name = var.instance_name cidr_block = "192.168.0.0/16" } # CIDR ブロック 192.168.10.0/24 の vSwitch を作成します。 resource "alicloud_vswitch" "vsw" { vpc_id = alicloud_vpc.vpc.id cidr_block = "192.168.10.0/24" zone_id = "cn-heyuan-a" vswitch_name = "terraform-example-1" } # CIDR ブロック 192.168.20.0/24 の別の vSwitch を作成します。 resource "alicloud_vswitch" "vsw1" { vpc_id = alicloud_vpc.vpc.id cidr_block = "192.168.20.0/24" zone_id = "cn-heyuan-b" vswitch_name = "terraform-example-2" } # KMS ソフトウェアキー管理インスタンスを作成し、ネットワークパラメーターを指定して起動します。 resource "alicloud_kms_instance" "default" { # ソフトウェアキー管理インスタンス。 product_version = "3" vpc_id = alicloud_vpc.vpc.id # KMS インスタンスがデプロイされるゾーン。取得したゾーン ID を使用します。 zone_ids = [ "cn-heyuan-a", "cn-heyuan-b", ] # vSwitch ID。 vswitch_ids = [ alicloud_vswitch.vsw.id,alicloud_vswitch.vsw1.id ] # コンピューティングパフォーマンス、キーの数、シークレットの数、およびアクセス管理操作の制限。 vpc_num = "1" key_num = "1000" secret_num = "100" spec = "1000" # オプション。他の VPC を KMS インスタンスに関連付けます。 # VPC と KMS インスタンスが異なる Alibaba Cloud アカウントに属している場合は、まず vSwitch を共有する必要があります。 #bind_vpcs { #vpc_id = "vpc-j6cy0l32yz9ttxfy6****" #vswitch_id = "vsw-j6cv7rd1nz8x13ram****" #region_id = "cn-shanghai" #vpc_owner_id = "119285303511****" #} #bind_vpcs { #vpc_id = "vpc-j6cy0l32yz9ttd7g3****" #vswitch_id = "vsw-3h4yrd1nz8x13ram****" #region_id = "cn-shanghai" #vpc_owner_id = "119285303511****" #} } # KMS インスタンスの CA 証明書をローカルファイルに保存します。 resource "local_file" "ca_certificate_chain_pem" { content = alicloud_kms_instance.default.ca_certificate_chain_pem filename = "ca.pem" }KMS インスタンスでのキー作成:
# キー仕様は Aliyun_AES_256 で、キーは暗号化と復号化 (ENCRYPT/DECRYPT) に使用されます。 resource "alicloud_kms_key" "kms_software_key_encrypt_decrypt" { description = "default_key_encrypt_decrypt description" # キーの使用方法。デフォルト値:ENCRYPT/DECRYPT。有効値:ENCRYPT/DECRYPT。この値は、キーがデータの暗号化と復号化に使用されることを示します。 key_usage = "ENCRYPT/DECRYPT" # キーの仕様。デフォルト値は Aliyun_AES_256 です。 key_spec = "Aliyun_AES_256" # KMS インスタンスの ID。 dkms_instance_id = alicloud_kms_instance.default.id pending_window_in_days = 7 # オプション。リソースに割り当てるタグのマップ。 # tags = { # "Environment" = "Production" # "Name" = "KMS-01" # "SupportTeam" = "PlatformEngineering" # "Contact" = "ali***@test.com" # } } # キーエイリアスは alias/kms_software_key_encrypt_decrypt で、Alibaba Cloud アカウント内で一意である必要があります。 resource "alicloud_kms_alias" "kms_software_key_encrypt_decrypt_alias" { # エイリアス。 alias_name = "alias/kms_software_key_encrypt_decrypt" # キー ID。 key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id }次の内容を
main.tfに追加して、シークレットを作成します。汎用シークレット
# 値が secret_data_kms_secret_general1 の kms_secret_general1 という名前の汎用シークレットを作成します。 resource "alicloud_kms_secret" "kms_secret_general" { # 名前。 secret_name = "kms_secret_general1" # 説明。 description = "secret_data_kms_secret_general" # タイプ。 secret_type = "Generic" # シークレットを強制的に削除するかどうかを指定します。デフォルト値:false。指定可能な値:true, false。 force_delete_without_recovery = true # KMS インスタンスの ID。 dkms_instance_id = alicloud_kms_instance.default.id # KMS キーの ID。 encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id # バージョン ID。 version_id = "v1" # シークレット値のタイプ。デフォルト値:text。指定可能な値:text, binary。 secret_data_type = "text" # データ。 secret_data = "secret_data_kms_secret_general1" }RAM シークレット
# この例では、RAM シークレットの作成方法を説明します。 # 開始する前に、管理対象 RAM シークレットの作成対象となる RAM ユーザーと AccessKey ペアを作成します。 # このプロセスは 2 つのステップで構成されます。 # ステップ 1:RAM ユーザーの AccessKey ペアを管理する権限を KMS に付与します。 # 1.1 AliyunKMSManagedRAMCrendentialsRolePolicy という名前のカスタムポリシーを作成します。 resource "alicloud_ram_policy" "AliyunKMSManagedRAMCrendentialsRolePolicy" { policy_name = "AliyunKMSManagedRAMCrendentialsRolePolicy" policy_document = <<EOF { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ram:ListAccessKeys", "ram:CreateAccessKey", "ram:DeleteAccessKey", "ram:UpdateAccessKey" ], "Resource": "*" } ] } EOF description = "AliyunKMSManagedRAMCrendentialsRolePolicy" force = true } # 1.2 AliyunKMSManagedRAMCrendentialsRole という名前の RAM ロールを作成します。 resource "alicloud_ram_role" "AliyunKMSManagedRAMCrendentialsRole" { name = "AliyunKMSManagedRAMCrendentialsRole" description = "AliyunKMSManagedRAMCrendentialsRole" document = <<EOF { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "kms.aliyuncs.com" ] } } ], "Version": "1" } EOF force = true } # 1.3 AliyunKMSManagedRAMCrendentialsRolePolicy ポリシーを AliyunKMSManagedRAMCrendentialsRole ロールにアタッチします。 resource "alicloud_ram_role_policy_attachment" "attach" { policy_name = alicloud_ram_policy.AliyunKMSManagedRAMCrendentialsRolePolicy.policy_name policy_type = alicloud_ram_policy.AliyunKMSManagedRAMCrendentialsRolePolicy.type role_name = alicloud_ram_role.AliyunKMSManagedRAMCrendentialsRole.name } # ステップ 2:RAM シークレットを作成します。 resource "alicloud_kms_secret" "kms_secret_RAMCredentials" { # シークレットの名前。 secret_name = "my_secret" # 説明。 description = "secret_kms_secret_RAMCredentials" # シークレットのタイプ。 secret_type = "RAMCredentials" # KMS インスタンスの ID。 dkms_instance_id = alicloud_kms_instance.default.id # シークレット値の暗号化に使用されるキーの ID。 encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id # シークレットを強制的に削除するかどうかを指定します。デフォルト値:false。指定可能な値:true, false。 force_delete_without_recovery = true # 自動ローテーションを有効にするかどうかを指定します。デフォルト値:false。指定可能な値:true, false。 enable_automatic_rotation = true # 自動ローテーションの間隔。 rotation_interval = "7d" # 拡張設定。UserName の値を実際の RAM ユーザー名に置き換えます。 extended_config = "{\"SecretSubType\":\"RamUserAccessKey\", \"UserName\":\"testuser\"}" # バージョン。 version_id = "V1" # シークレット値のタイプ。デフォルト値:text。指定可能な値:text, binary。 secret_data_type ="text" # シークレット値。 secret_data = "{\"AccessKeys\":[{\"AccessKeyId\":\"LTAI****************\",\"AccessKeySecret\":\"yourAccessKeySecret\"}]}" }RDS シークレット
この例では、デュアルアカウントホスティングモードで RDS シークレットを作成する方法を説明します。
variable "region" { default = "cn-hangzhou" } provider "alicloud" { region = var.region } variable "zone_id" { default = "cn-hangzhou-b" } variable "instance_type" { default = "pg.n2.2c.2m" } # VPC を作成します。 resource "alicloud_vpc" "main" { vpc_name = "alicloud" cidr_block = "172.16.0.0/16" } # vSwitch を作成します。 resource "alicloud_vswitch" "main" { vpc_id = alicloud_vpc.main.id cidr_block = "172.16.192.0/20" zone_id = var.zone_id depends_on = [alicloud_vpc.main] } # ApsaraDB RDS for PostgreSQL インスタンスを作成します。 resource "alicloud_db_instance" "instance" { engine = "PostgreSQL" engine_version = "13.0" instance_type = var.instance_type instance_storage = "30" instance_charge_type = "Postpaid" vswitch_id = alicloud_vswitch.main.id } # RDS シークレットを作成します。 resource "alicloud_kms_secret" "kms_secret_RDS_MYSQL" { # シークレットの名前。 secret_name = "rds_secret/${alicloud_db_instance.instance.id}" # シークレットのタイプ。 secret_type = "Rds" # KMS インスタンスの ID。 dkms_instance_id = alicloud_kms_instance.default.id # シークレット値の暗号化に使用されるキーの ID。 encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id # 自動ローテーションを有効にするかどうかを指定します。デフォルト値:false。指定可能な値:true, false。 enable_automatic_rotation = true # 自動ローテーションの間隔。 rotation_interval = "7d" # シークレットを強制的に削除するかどうかを指定します。デフォルト値:false。指定可能な値:true, false。 force_delete_without_recovery = true # 設定。 extended_config = "{\"SecretSubType\":\"DoubleUsers\", \"DBInstanceId\":\"${alicloud_db_instance.instance.id}\" ,\"CustomData\": {}}" # バージョン。 version_id = "V1" # シークレット値のタイプ。デフォルト値:text。指定可能な値:text, binary。 secret_data_type = "text" # シークレット値。 secret_data = "{\"Accounts\":[{\"AccountName\":\"rdsuser1\",\"AccountPassword\":\"Admin****\"},{\"AccountName\":\"rdsuser2\",\"AccountPassword\":\"Admin****\"}]}" }ECS シークレット
// ECS シークレットを作成します。 // 開始する前に、ID が i-bp14yu34xwbimp56****、ユーザー名が root、パスワードが Admin**** の ECS インスタンスを作成済みであることを確認してください。 // シークレットタイプは、大文字の値 ECS である必要があります。「Ecs」のような値は使用できません。指定可能な値:Generic、Rds、Redis、RAMCredentials、ECS、PolarDB。 // シークレット名は acs/ecs/ で始まる必要があります。 resource "alicloud_kms_secret" "kms_secret_ECS" { secret_name = "acs/ecs/ecsSecretName" secret_data_type = "text" secret_data = "{\"UserName\":\"root\",\"Password\":\"Admin****\"}" secret_type = "ECS" version_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.primary_key_version // シークレット値の暗号化に使用されるキーの ID。 encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id dkms_instance_id = var.soft_kms_instance enable_automatic_rotation = true rotation_interval = "7d" // 拡張設定では、シークレットのサブタイプは Password または SSHKey のいずれかです。リージョン ID と ECS インスタンス ID も必須です。 extended_config = "{\"SecretSubType\":\"Password\",\"RegionId\":\"eu-central-1\", \"InstanceId\":\"i-bp14yu34xwbimp56****\"}" force_delete_without_recovery = true }// SSHKey サブタイプの ECS シークレットを作成します。 // 開始する前に、ID が i-bp14yu34xwbimp57****、ユーザー名が root で、SSH キーペアを持つ ECS インスタンスを作成済みであることを確認してください。 resource "alicloud_kms_secret" "kms_secret_ECS_sshkey" { // シークレット名は acs/ecs/ で始まる必要があります。 secret_name = "acs/ecs/ecsSecretSshKeyName" secret_data_type = "text" // SSHKey サブタイプの場合、シークレット値にはユーザー名、公開キー、および秘密キーを含める必要があります。 secret_data = "{\"UserName\":\"root\",\"PublicKey\":\"ssh-rsa AAAAB3Nza****\",\"PrivateKey\":\"-----BEGIN RSA PRIVATE KEY-----****-----END RSA PRIVATE KEY-----\"}" // シークレットのタイプは、大文字の値 ECS である必要があります。 secret_type = "ECS" version_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.primary_key_version // シークレット値の暗号化に使用されるキーの ID。 encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id dkms_instance_id = var.soft_kms_instance // シークレットのサブタイプを SSHKey に設定し、ECS インスタンスのリージョンとインスタンス ID を指定します。 extended_config = "{\"SecretSubType\":\"SSHKey\",\"RegionId\":\"cn-hangzhou\", \"InstanceId\":\"i-bp14yu34xwbimp57****\"}" force_delete_without_recovery = true }
次のコマンドを実行して、
Terraformのランタイム環境を初期化します。terraform initTerraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.実行計画を作成し、変更をプレビューします。
terraform plan次のコマンドを実行して、汎用シークレットを作成します。
terraform applyプロンプトが表示されたら、
yesと入力して Enter キーを押します。コマンドが完了するまで待ちます。次のような出力が表示されたら、汎用シークレットが作成されたことを示します。Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes ... alicloud_kms_key.kms_software_key_encrypt_decrypt: Creation complete after 0s [id=key-shh6715c21812y8i7z***] alicloud_kms_alias.kms_software_key_encrypt_decrypt_alias: Creating... alicloud_kms_secret.kms_secret_general: Creating... alicloud_kms_alias.kms_software_key_encrypt_decrypt_alias: Creation complete after 0s [id=alias/kms_secret] alicloud_kms_secret.kms_secret_general: Creation complete after 1s [id=kms_secret_general1] ... Apply complete! Resources: 2 added, 0 changed, 0 destroyed.結果の確認
Terraform show
次のコマンドを実行すると、Terraformで作成したリソースの詳細を表示できます。
terraform show"Name" = "KMS-001" "SupportTeam" = "PlatformEngineering" } } # alicloud_kms_secret.kms_secret_general: resource "alicloud_kms_secret" "kms_secret_general" { arn = "acs:kms:xxx:xxx/kms_secret_general1" create_time = "2024-10-21T02:53:13Z" description = "secret_data_kms_secret_general" dkms_instance_id = "kst-xxx" enable_automatic_rotation = false encryption_key_id = "key-xxx" force_delete_without_recovery = false id = "kms_secret_general1" policy = jsonencode( { Statement = [ { Action = [ "kms:*", ] Effect = "Allow" Principal = { RAM = [ "acs:ram::xxx:*", ] } Resource = [ "*", ] Sid = "kms default secret policy" }, ] Version = "1" } ) recovery_window_in_days = 30 secret_data = (sensitive value) secret_data_type = "text" secret_name = "kms_secret_general1" secret_type = "Generic" tags = {} version_id = "v1" version_stages = [ "ACSCurrent", ] }KMS コンソールへのログイン
Key Management Service コンソールにログインして、作成されたシークレットを表示します。
リソースのクリーンアップ
Terraform によって管理されているリソースが不要になったら、次のコマンドを実行して解放してください。terraform destroy コマンドの詳細については、「一般的なコマンド」をご参照ください。
terraform destroy完全な例
このトピックのサンプルコードは、ワンクリックで実行できます。コードを実行