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

ApsaraDB RDS:Terraform を使用して ApsaraDB RDS for PostgreSQL インスタンスのデータセキュリティを強化する

最終更新日:Jul 05, 2025

このトピックでは、Terraform を使用して ApsaraDB RDS for PostgreSQL インスタンスのセキュリティグループ、IP アドレスホワイトリスト、および Secure Sockets Layer(SSL)暗号化設定を変更する方法について説明します。また、RDS インスタンスの拡張ホワイトリストモードを有効にする方法についても説明します。

説明

このトピックのサンプルコードは、数回クリックするだけで実行できます。詳細については、Terraform Explorer にアクセスしてください。

前提条件

  • RDS インスタンスが作成されていること。詳細については、「RDS インスタンスを作成する」をご参照ください。

  • RDS インスタンスが実行中状態であること。RDS インスタンスが実行中状態であるかどうかを確認するには、次のいずれかの方法を使用できます。

    • インスタンスの詳細を照会するに記載されている手順に従い、status パラメーターの値を確認します。値が Running の場合、RDS インスタンスは実行中です。

    • ApsaraDB RDS コンソール にログインし、必要なリージョンに切り替え、RDS インスタンスを見つけ、インスタンスの状態を確認します。

  • Alibaba Cloud アカウントがアカウント内のリソースに対するすべての権限を持っていること。Alibaba Cloud アカウントが漏洩した場合、リソースは大きなリスクにさらされます。Resource Access Management(RAM)ユーザーを使用し、RAM ユーザーの AccessKey ペアを作成することをお勧めします。詳細については、「RAM ユーザーを作成する」および「AccessKey ペアを作成する」をご参照ください。

  • RAM を使用して、クラウド リソースへのアクセス許可を効率的に管理する必要があります。これは、マルチユーザーコラボレーションの要件を満たすのに役立ち、過剰な権限によって引き起こされるセキュリティの脆弱性を防ぐために、最小権限の原則(PoLP)に基づいてユーザーに権限を付与することができます。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "vpc:DescribeVpcAttribute",
                    "vpc:DescribeRouteTableList",
                    "vpc:DescribeVSwitchAttributes",
                    "vpc:DeleteVpc",
                    "vpc:DeleteVSwitch",
                    "vpc:CreateVpc",
                    "vpc:CreateVSwitch",
                    "vpc:DescribeVSwitches",
                    "ecs:CreateSecurityGroup",
                    "ecs:ModifySecurityGroupPolicy",
                    "ecs:DescribeSecurityGroups",
                    "ecs:ListTagResources",
                    "ecs:DeleteSecurityGroup",
                    "ecs:DescribeSecurityGroupAttribute",
                    "ecs:AuthorizeSecurityGroup",
                    "ecs:RevokeSecurityGroup"
                ],
                "Resource": "*"
            },
            {
                "Action": "rds:*", // RDS のすべてのアクションを許可
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Action": "dbs:*", // DBS のすべてのアクションを許可
                "Resource": "acs:rds:*:*:*",
                "Effect": "Allow"
            },
            {
                "Action": "hdm:*", // HDM のすべてのアクションを許可
                "Resource": "acs:rds:*:*:*",
                "Effect": "Allow"
            },
            {
                "Action": "dms:LoginDatabase", // DMS のデータベースログインを許可
                "Resource": "acs:rds:*:*:*",
                "Effect": "Allow"
            },
            {
                "Effect": "Allow",
                "Action": "ram:CreateServiceLinkedRole", // サービスリンクロールの作成を許可
                "Resource": "*",
                "Condition": {
                    "StringEquals": {
                        "ram:ServiceName": [
                            "backupencryption.rds.aliyuncs.com"
                        ]
                    }
                }
            },
            {
                "Effect": "Allow",
                "Action": "bss:ModifyAgreementRecord", // 契約レコードの変更を許可
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "bss:DescribeOrderList", // 注文リストの照会を許可
                    "bss:DescribeOrderDetail", // 注文詳細の照会を許可
                    "bss:PayOrder", // 注文の支払いを許可
                    "bss:CancelOrder" // 注文のキャンセルを許可
                ],
                "Resource": "*"
            }
        ]
    }
  • Terraform 環境を準備します。Terraform を使用するには、次のいずれかの方法を使用できます。

    • Terraform Explorer で Terraform を使用する:Alibaba Cloud は、Terraform のオンラインランタイム環境である Terraform Explorer を提供しています。Terraform Explorer にログインすれば、Terraform をインストールすることなく Terraform を使用できます。詳細については、「Terraform Explorer で Terraform を使用する」をご参照ください。この方法は、追加費用なしで Terraform を迅速かつ便利に使用およびデバッグしたい場合に適しています。

    • Cloud Shell で Terraform を使用する:Terraform は Cloud Shell にプリインストールされており、ID クレデンシャルが構成されています。Cloud Shell で Terraform コマンドを直接実行できます。詳細については、「Cloud Shell で Terraform を使用する」をご参照ください。この方法は、低コストで Terraform を迅速かつ便利に使用およびデバッグしたい場合に適しています。

    • オンプレミス マシンに Terraform をインストールして構成する:この方法は、ネットワークの状態が悪い場合やカスタム開発環境を使用する場合に適しています。詳細については、「ローカル PC に Terraform をインストールして構成する」をご参照ください。

リソース

説明

特定のリソースには課金されます。リソースが不要になった場合は、できるだけ早くリソースを解放するか、サブスクライブを解除する必要があります。

セキュリティグループを変更する

このセクションでは、RDS インスタンスのセキュリティグループを sg-**** に変更する方法について説明します。

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

    • 必要なリソースを作成します。

      variable "region" {
        default = "cn-shenzhen"
      }
      
      variable "zone_id" {
        default = "cn-shenzhen-c"
      }
      
      variable "instance_type" {
        default = "pg.n2.2c.2m"
      }
      
      provider "alicloud" {
        region = var.region
      }
      
      # 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
      }
      
      # セキュリティグループを作成します。
      resource "alicloud_security_group" "example" {
        name   = "terraform-example"
        vpc_id = alicloud_vpc.main.id
      }
      
      # RDS インスタンスを作成します。
      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
      }                    
    • main.tf ファイルで、resource "alicloud_db_instance" "instance" {} 構成アイテムに security_group_ids フィールドを追加し、次のコードスニペットに基づいてフィールドを構成します。

      ...
      resource "alicloud_db_instance" "instance" {
      ...
        security_group_ids =  [alicloud_security_group.example.id]
      }  
    説明

    変更後、新しい構成は元の構成を上書きします。複数のセキュリティグループを構成する場合は、security_group_ids フィールドの値にセキュリティグループの ID を追加し、ID をカンマ(,)で区切ります。security_group_ids フィールドの値は角かっこ [] で囲みます。

  2. 次のコマンドを実行して、Terraform のランタイム環境を初期化します。

    terraform init

    次の情報が返された場合、Terraform は初期化されています。

    Initializing the backend...
    
    Initializing provider plugins...
    - Checking for available provider plugins...
    - Downloading plugin for provider "alicloud" (hashicorp/alicloud) 1.90.1...
    ...
    
    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 キーを押します。コマンドが正常に実行されるまで待ちます。次の情報が表示された場合、操作は成功です。

    alicloud_db_instance.instance: Modifying... [id=pgm-****]
    alicloud_db_instance.instance: Modifications complete after 4s [id=pgm-****]
    
    Apply complete!  Resources: 0 added, 1 changed, 0 destroyed.
  5. 結果を確認します。

    terraform show コマンドを実行する

    セキュリティグループを表示するには、次のコマンドを実行します。

    terraform show
    # alicloud_db_instance.instance:
    resource "alicloud_db_instance" "instance" {
        client_ca_enabled          = 0
        client_crl_enabled         = 0
        connection_string          = "pgm-****.pg.rds.aliyuncs.com"
        connection_string_prefix   = "pgm-****"
        db_instance_storage_type   = "cloud_essd"
        db_time_zone               = "Asia/shenzhen"
        deletion_protection        = false
        engine                     = "PostgreSQL"
        engine_version             = "13.0"
        force_restart              = false
        ha_config                  = "Manual"
        id                         = "pgm-****"
        instance_charge_type       = "Postpaid"
        instance_name              = "terraformtest"
        instance_storage           = 50
        instance_type              = "pg.n2.2c.2m"
        maintain_time              = "05:00Z-06:00Z"
        manual_ha_time             = "2022-09-30T09:00:00Z"
        monitoring_period          = 300
        period                     = 0
        port                       = "5432"
        private_ip_address         = "192.168.XX.XX"
        resource_group_id          = "rg-****"
        security_group_id          = "sg-****"
        security_group_ids         = [
            "sg-****",
        ]
        security_ip_mode           = "normal"
        security_ips               = [
            "127.0.0.1",
        ]
        sql_collector_config_value = 30
        sql_collector_status       = "Disabled"
        storage_auto_scale         = "Enable"
        storage_threshold          = 30
        storage_upper_bound        = 100
        target_minor_version       = "rds_postgres_1300_20220830"
        tcp_connection_type        = "SHORT"
        vpc_id                     = "vpc-****"
        vswitch_id                 = "vsw-****"
        zone_id                    = "cn-hangzhou-j"
    
        pg_hba_conf {
            address     = "127.0.0.1"
            database    = "all"
            method      = "md5"
            priority_id = 1
            type        = "host"
            user        = "all"
        }
    }

    ApsaraDB RDS コンソールにログインする

    ApsaraDB RDS コンソール にログインして、セキュリティグループを表示します。安全组

IP アドレスホワイトリストを変更する

このセクションでは、IP アドレスホワイトリストを 0.0.0.0/0 に変更する方法について説明します。

  1. main.tf ファイルで、resource "alicloud_db_instance" "instance" {} 構成アイテムに security_ips フィールドを追加し、次のコードスニペットに基づいてフィールドを構成します。

    ...
    resource "alicloud_db_instance" "instance" {
    ...
      security_ips =  ["0.0.0.0/0"]
    }  
    説明

    変更後、新しい構成は元の構成を上書きします。ホワイトリストに複数の IP アドレスを追加する場合は、security_ips フィールドの値に IP アドレスを追加し、IP アドレスをカンマ(,)で区切ります。security_ips フィールドの値は角かっこ [] で囲みます。

  2. 次のコマンドを実行します。

    terraform apply

    実行中に、プロンプトが表示されたら yes と入力し、Enter キーを押します。コマンドが正常に実行されるまで待ちます。次の情報が表示された場合、操作は成功です。

    alicloud_db_instance.instance: Modifying... [id=pgm-****]
    alicloud_db_instance.instance: Modifications complete after 6s [id=pgm-****]
    
    Apply complete!  Resources: 0 added, 1 changed, 0 destroyed.
  3. 結果を確認します。

    terraform show コマンドを実行する

    IP アドレスホワイトリストを表示するには、次のコマンドを実行します。

    terraform show
    # alicloud_db_account.account:
    resource "alicloud_db_account" "account" {
        account_name     = "tf_account_test"
        account_password = (sensitive value)
        account_type     = "Normal"
        db_instance_id   = "pgm-****"
        id               = "pgm-****:tf_account_test"
        instance_id      = "pgm-****"
        name             = "tf_account_test"
        status           = "Available"
        type             = "Normal"
    }
    
    # alicloud_db_instance.instance:
    resource "alicloud_db_instance" "instance" {
        client_ca_enabled          = 0
        client_crl_enabled         = 0
        connection_string          = "pgm-****.pg.rds.aliyuncs.com"
        connection_string_prefix   = "pgm-****"
        db_instance_storage_type   = "cloud_essd"
        db_time_zone               = "Asia/shenzhen"
        deletion_protection        = false
        engine                     = "PostgreSQL"
        engine_version             = "13.0"
        force_restart              = false
        ha_config                  = "Auto"
        id                         = "pgm-****"
        instance_charge_type       = "Postpaid"
        instance_name              = "terraformtest"
        instance_storage           = 50
        instance_type              = "pg.n2.2c.2m"
        maintain_time              = "05:00Z-06:00Z"
        monitoring_period          = 300
        period                     = 0
        port                       = "5432"
        private_ip_address         = "172.16.XX.XX"
        resource_group_id          = "rg-****"
        security_group_ids         = []
        security_ip_mode           = "normal"
        security_ips               = [
            "127.0.0.1",
        ]
        sql_collector_config_value = 30
        sql_collector_status       = "Disabled"
        storage_auto_scale         = "Enable"
        storage_threshold          = 30
        storage_upper_bound        = 100
        target_minor_version       = "rds_postgres_1300_20220730"
        tcp_connection_type        = "SHORT"
        vpc_id                     = "vpc-****"
        vswitch_id                 = "vsw-****"
        zone_id                    = "cn-heyuan-j"
    
        pg_hba_conf {
            address     = "127.0.0.1"
            database    = "all"
            method      = "md5"
            priority_id = 1
            type        = "host"
            user        = "all"
        }
    }
                                    

    ApsaraDB RDS コンソールにログインする

    ApsaraDB RDS コンソール にログインして、IP アドレスホワイトリストを表示します。白名单

SSL 暗号化設定を変更する

このセクションでは、RDS インスタンスの SSL 暗号化を有効にする方法について説明します。

  1. main.tf ファイルで、resource "alicloud_db_instance" "instance" {} 構成アイテムに ssl_action フィールドを追加し、次のコードスニペットに基づいてフィールドを構成します。

    ...
    resource "alicloud_db_instance" "instance" {
    ...
      ssl_action  =  "Open"
    }  
  2. 次のコマンドを実行します。

    terraform apply

    実行中に、プロンプトが表示されたら yes と入力し、Enter キーを押します。コマンドが正常に実行されるまで待ちます。次の情報が表示された場合、操作は成功です。

    alicloud_db_instance.instance: Modifying... [id=pgm-****]
    alicloud_db_instance.instance: Still modifying... [id=pgm-****, 10s elapsed]
    ...
    alicloud_db_instance.instance: Still modifying... [id=pgm-****, 6m31s elapsed]
    alicloud_db_instance.instance: Modifications complete after 6m35s [id=pgm-****]
    
    Apply complete!  Resources: 0 added, 1 changed, 0 destroyed.
  3. 結果を確認します。

    terraform show コマンドを実行する

    SSL 設定を表示するには、次のコマンドを実行します。

    terraform show
    # alicloud_db_instance.instance:
    resource "alicloud_db_instance" "instance" {
        acl                        = "prefer"
        ca_type                    = "aliyun"
        client_ca_enabled          = 0
        client_crl_enabled         = 0
        connection_string          = "pgm-****.pg.rds.aliyuncs.com"
        connection_string_prefix   = "pgm-****"
        db_instance_storage_type   = "cloud_essd"
        db_time_zone               = "Asia/shenzhen"
        deletion_protection        = false
        engine                     = "PostgreSQL"
        engine_version             = "13.0"
        force_restart              = false
        ha_config                  = "Auto"
        id                         = "pgm-****"
        instance_charge_type       = "Postpaid"
        instance_name              = "terraformtest"
        instance_storage           = 50
        instance_type              = "pg.n2.2c.2m"
        maintain_time              = "05:00Z-06:00Z"
        monitoring_period          = 300
        period                     = 0
        port                       = "5432"
        private_ip_address         = "192.168.XX.XX"
        replication_acl            = "prefer"
        resource_group_id          = "rg-****"
        security_group_id          = "sg-****"
        security_group_ids         = [
            "sg-****",
        ]
        security_ip_mode           = "normal"
        security_ips               = [
            "0.0.0.0/0",
        ]
        server_cert                = <<-EOT
            -----BEGIN CERTIFICATE-----
            MIIE7jCCA9agAwIBAgICO3****2
            N9xwKlPQ65q/kux0yErtwhAD
            -----END CERTIFICATE-----
        EOT
        server_key                 = <<-EOT
            -----BEGIN RSA PRIVATE KEY-----
            MIIJKQIBAAKCAgEAux0yE****e+VAdGp
            -----END RSA PRIVATE KEY-----
        EOT
        sql_collector_config_value = 30
        sql_collector_status       = "Disabled"
        ssl_action                 = "Open"
        ssl_status                 = "0"
        storage_auto_scale         = "Enable"
        storage_threshold          = 30
        storage_upper_bound        = 100
        target_minor_version       = "rds_postgres_1300_20220830"
        tcp_connection_type        = "SHORT"
        vpc_id                     = "vpc-****"
        vswitch_id                 = "vsw-****"
        zone_id                    = "cn-hangzhou-j"
    
        pg_hba_conf {
            address     = "127.0.0.1"
            database    = "all"
            method      = "md5"
            priority_id = 1
            type        = "host"
            user        = "all"
        }
    }

    ApsaraDB RDS コンソールにログインする

    ApsaraDB RDS コンソール にログインして、SSL 設定を表示します。SSL

Premium Local SSD を使用する RDS インスタンスの拡張ホワイトリストモードを有効にする

  1. main.tf ファイルで、resource "alicloud_db_instance" "instance" {} 構成アイテムに security_ip_mode フィールドを追加し、次のコードスニペットに基づいてフィールドを構成します。

    ...
    resource "alicloud_db_instance" "instance" {
    ...
      security_ip_mode = "safety"
    }                      
    説明

    拡張ホワイトリストモードは、標準ホワイトリストモードに戻すことができません。

  2. 次のコマンドを実行します。

    terraform apply

    実行中に、プロンプトが表示されたら yes と入力し、Enter キーを押します。コマンドが正常に実行されるまで待ちます。次の情報が表示された場合、操作は成功です。

    alicloud_db_instance.instance: Modifying... [id=pgm-****]
    alicloud_db_instance.instance: Modifications complete after 3s [id=pgm-****]
    
    Apply complete!  Resources: 0 added, 1 changed, 0 destroyed.
  3. 結果を確認します。

    terraform show コマンドを実行する

    ホワイトリストモードを表示するには、次のコマンドを実行します。

    terraform show
    # alicloud_db_instance.instance:
    resource "alicloud_db_instance" "instance" {
        acl                        = "prefer"
        ca_type                    = "aliyun"
        client_ca_enabled          = 0
        client_crl_enabled         = 0
        connection_string          = "pgm-****.pg.rds.aliyuncs.com"
        connection_string_prefix   = "pgm-****"
        db_instance_storage_type   = "cloud_essd"
        db_time_zone               = "Asia/shenzhen"
        deletion_protection        = false
        engine                     = "PostgreSQL"
        engine_version             = "13.0"
        force_restart              = false
        ha_config                  = "Auto"
        id                         = "pgm-****"
        instance_charge_type       = "Postpaid"
        instance_name              = "terraformtest"
        instance_storage           = 50
        instance_type              = "pg.n2.2c.2m"
        maintain_time              = "05:00Z-06:00Z"
        monitoring_period          = 300
        period                     = 0
        port                       = "5432"
        private_ip_address         = "192.168.XX.XX"
        replication_acl            = "prefer"
        resource_group_id          = "rg-****"
        security_group_id          = "sg-****"
        security_group_ids         = [
            "sg-****",
        ]
        security_ip_mode           = "safety"
        security_ip_mode           = "normal"
        security_ips               = [
            "0.0.0.0/0",
        ]
        server_cert                = <<-EOT
            -----BEGIN CERTIFICATE-----
            MIIE7jCCA9agAwIBAgICO3****2
            N9xwKlPQ65q/kux0yErtwhAD
            -----END CERTIFICATE-----
        EOT
        server_key                 = <<-EOT
            -----BEGIN RSA PRIVATE KEY-----
            MIIJKQIBAAKCAgEAux0yE****e+VAdGp
            -----END RSA PRIVATE KEY-----
        EOT
        sql_collector_config_value = 30
        sql_collector_status       = "Disabled"
        ssl_action                 = "Open"
        ssl_status                 = "0"
        storage_auto_scale         = "Enable"
        storage_threshold          = 30
        storage_upper_bound        = 100
        target_minor_version       = "rds_postgres_1300_20220830"
        tcp_connection_type        = "SHORT"
        vpc_id                     = "vpc-****"
        vswitch_id                 = "vsw-****"
        zone_id                    = "cn-hangzhou-j"
    
        pg_hba_conf {
            address     = "127.0.0.1"
            database    = "all"
            method      = "md5"
            priority_id = 1
            type        = "host"
            user        = "all"
        }
    }

    ApsaraDB RDS コンソールにログインする

    ApsaraDB RDS コンソール にログインして、ホワイトリストモードを表示します。高安全白名单

リソースをクリアする

Terraform を使用して作成または管理された上記の不要なリソースがある場合は、次のコマンドを実行してリソースを解放します。terraform destroy コマンドの詳細については、「共通コマンド」をご参照ください。

terraform destroy

完全なサンプルコード

説明

このトピックのサンプルコードは、数回クリックするだけで実行できます。詳細については、Terraform Explorer にアクセスしてください。

サンプルコード

variable "region" {
  default = "cn-shenzhen"
}

variable "zone_id" {
  default = "cn-shenzhen-c"
}

variable "instance_type" {
  default = "pg.n2.2c.2m"
}

variable "target_minor_version" {
  default = "rds_postgres_1300_20240830"
}

variable "security_ips" {
  default = "0.0.0.0/0"
}

provider "alicloud" {
  region = var.region
}

# 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
}

resource "alicloud_security_group" "example" {
  name   = "terraform-example"
  vpc_id = alicloud_vpc.main.id
}

# RDS インスタンスを作成します。
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
  # セキュリティグループを変更します。
  # security_group_ids   = [alicloud_security_group.example.id]
  # IP アドレスのホワイトリストを変更します。
  # security_ips         =  [var.security_ips]
  # SSL 暗号化設定を変更します。
  # ssl_action           =  "Open"
  # プレミアムローカル SSD を使用する RDS インスタンスの拡張ホワイトリストモードを有効にします。
  # security_ip_mode     = "safety"
}                    

さらに多くの例を試したい場合は、quickstarts ページにアクセスし、対応する サービス のフォルダにある例をご覧ください。