すべてのプロダクト
Search
ドキュメントセンター

Key Management Service:Terraform を使用したシークレットの作成

最終更新日:Mar 01, 2026

Terraform を使用してシークレットを作成および管理できます。 このトピックでは、シークレットを作成する方法の例を説明します。

概要

Key Management Service (KMS) は、指定されたキーを使用してシークレットを暗号化し、保護します。 シークレットを作成する前に、キーを作成する必要があります。 シークレットの詳細については、「シークレット管理の概要」をご参照ください。

説明

このトピックのサンプルコードは、ワンクリック実行をサポートしています。 コードを直接実行できます。 コードの実行

前提条件

  • Alibaba Cloud アカウントは、すべてのリソースに対する完全な権限を持っています。 Alibaba Cloud アカウントの認証情報が漏洩すると、ご利用のリソースが高いセキュリティリスクにさらされます。 Resource Access Management (RAM) ユーザーと、その RAM ユーザーの AccessKey ペアを作成することを推奨します。 詳細については、「RAM ユーザーの作成」および「AccessKey ペアの作成」をご参照ください。

  • RAM ユーザーに次の権限を付与します:AliyunKMSFullAccess (Key Management Service の管理用) と AliyunRAMFullAccess (Resource Access Management の管理用)。 詳細については、「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 を迅速かつ便利にテストおよびデバッグしたいシナリオに適しています。

    Cloud Shell:Terraform コンポーネントは Alibaba Cloud の Cloud Shell にプリインストール済みで、認証情報も構成済みです。 Cloud Shell で Terraform コマンドを直接実行できます。 この方法は、迅速、便利、かつ低コストで Terraform にアクセスして使用したいシナリオに適しています。

    ご利用のコンピューターへの Terraform のインストールと構成:この方法は、ネットワーク接続が悪い場合や、カスタム開発環境が必要なシナリオに適しています。

重要

Terraform のバージョンが 0.12.28 以降であることを確認してください。 バージョンを確認するには、terraform --version コマンドを実行します。

使用されるリソース

Terraform を使用したシークレットの作成

重要

`secret_data` (シークレット値) に `sensitive = true` を設定して、機密性の高いシークレット値がログやコンソールに出力されないようにします。 詳細については、「機密性の高い入力変数の保護」をご参照ください。

この例では、汎用シークレットを作成する方法を示します。

  1. 作業ディレクトリを作成し、そのディレクトリに main.tf という名前の構成ファイルを作成します。

    1. 次の内容を 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"
      }
      # ソフトウェアキー管理インスタンスを作成し、ネットワークパラメーターで起動します。
      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 インスタンスの VPC が異なる 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
      }
    2. 次の内容を main.tf に追加して、シークレットを作成します。

      1. 汎用シークレット

        # 値が 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"
        }
      2. 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 の値をご利用のユーザー名に置き換えます。
          extended_config = "{\"SecretSubType\":\"RamUserAccessKey\", \"UserName\":\"testuser\"}" 
          # バージョン。
          version_id = "V1"
          # シークレット値のタイプ。 デフォルト:text。 有効値:text、binary。
          secret_data_type ="text"
          # データ。
          secret_data = "{\"AccessKeys\":[{\"AccessKeyId\":\"LTAI****************\",\"AccessKeySecret\":\"yourAccessKeySecret\"}]}"
        }
      3. 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.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\":\"rm-7xv1450tq4pj4****\" ,\"CustomData\": {}}"
          # バージョン。
          version_id = "V1"
          # シークレット値のタイプ。 デフォルト:text。 有効値:text、binary。
          secret_data_type = "text"
          # データ。
          secret_data = "{\"Accounts\":[{\"AccountName\":\"rdsuser1\",\"AccountPassword\":\"Admin****\"},{\"AccountName\":\"rdsuser2\",\"AccountPassword\":\"Admin****\"}]}"
        }
  2. 次のコマンドを実行して、Terraform 環境を初期化します。

    terraform init
    Terraform 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.
  3. 実行計画を作成し、変更をプレビューします。

    terraform plan
  4. 次のコマンドを実行して、汎用シークレットを作成します。

    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.
  5. 検証結果

    terraform show コマンドの実行

    次のコマンドを実行して、Terraform を使用して作成したリソースの詳細をクエリします:

    terraform show

    image

    Key Management Service コンソールへのログイン

    Key Management Service コンソールにログインして、作成したシークレットを表示します。

リソースのクリーンアップ

Terraform によって作成または管理されたリソースが不要になった場合は、次のコマンドを実行してそれらをリリースします。 terraform destroy コマンドの詳細については、「一般的なコマンド」をご参照ください。

terraform destroy

完全な例

説明

このトピックのサンプルコードは、ワンクリック実行をサポートしています。 コードを直接実行できます。 コードの実行

サンプルコード

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"
}
# ソフトウェアキー管理インスタンスを作成し、ネットワークパラメーターで起動します。
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"
}
# KMS インスタンスの CA 証明書をローカルファイルに保存します。
 resource "local_file" "ca_certificate_chain_pem" {
 content  = alicloud_kms_instance.default.ca_certificate_chain_pem
 filename = "ca.pem"
}
# キーの仕様は Aliyun_AES_256 で、暗号化と復号 (ENCRYPT/DECRYPT) に使用されます。
resource "alicloud_kms_key" "kms_software_key_encrypt_decrypt" {
  timeouts {
    delete = "30m" # 削除のタイムアウト期間を追加します。
  }
  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
}
# キーエイリアスは 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
}
# 値が 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"
}