🌥️

TerraformでAlibabaCloudのIaCを構築

2022/10/08に公開

利用方法

TerraformでAlibabaCloudのクラウドリソースを作成する方法は2つあります。

  • Cloud Shell
  • ローカルにインストール

Cloud ShellはAlibabaCloud管理コンソールの右上のアイコンもしくは以下のURLから利用可能
https://shell.aliyun.com

Cloud ShellはTerraformが標準で入っているため、本記事ではローカルにインストールするのを説明していきます。

ローカル環境設定

インストール

オフィシャルサイトからTerraformをダウンロードし、インストールします。
https://www.terraform.io/downloads

Macの場合はhomebrewからインストールできます。

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

Access Keyの設定

AlibabaCloudの管理コンソールでTerraform用のRAMユーザーを作成します。

RAMに必要な権限を付与し、AccessKeyとSECRETをメモします。
メモしたAccessKeyとSECRETを環境変数に設定します。
語尾に追加

.bach_profile
# ファイルにAccessKeyとSECRETを追加
export ALICLOUD_ACCESS_KEY="************"
export ALICLOUD_SECRET_KEY="************"
source ~/.bash_profile

Providerの設定

provider.tfというファイルを作成します。

provider.tf
terraform {
    required_providers {
        alicloud = {
            source  = "aliyun/alicloud"
            version = "1.187.0"
        }
    }
}

provider "alicloud" {
    profile = "default"
    region  = "ap-northeast-1"
}

versionのところに記載するProviderのバージョンはこちらで確認できます。
https://registry.terraform.io/providers/aliyun/alicloud/latest

こちらの初期化コマンドを実行します。

terraform init

tfstateファイルbackendの設定(Option)

  • tfstateファイルをローカルに保存
    リソースの状態を管理するtfstateファイルはデフォルトでローカルに保存されます。もしローカルの保存で充分の場合はこちらの手順をスキップします。
  • tfstateファイルをクラウドに保存
    tfstateファイルはオブジェクトストレージOSSに保存できます。
    複数人が使う場合、ロックはNoSQLのTableStoreの保存できます。

module.tfというファイルを作成します。

module.tf
module "remote_state" {
    source                   = "terraform-alicloud-modules/remote-backend/alicloud"
    create_backend_bucket    = true
    create_ots_lock_instance = true
    create_ots_lock_table    = true
    region                   = "ap-northeast-1"
    state_name               = "prod/terraform.tfstate"
    encrypt_state            = true
}

backendを生成するモジュールはこちらです。
https://registry.terraform.io/modules/terraform-alicloud-modules/remote-backend/alicloud/latest

再度初期化コマンドを実行します。

terraform init

TableStoreでインスタンス作成時にデフォルトはパフォーマンス型です。
https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ots_instance

現時点で日本リージョンでパフォーマンス型はまだないです。
手動で以下のモジュールファイルを修正する必要があります。
.terraform/modules/remote_state/main.tf

.terraform/modules/remote_state/main.tf
# OTS table store to lock state during applies
resource "alicloud_ots_instance" "this" {
    count       = var.create_ots_lock_instance ? 1 : 0
    name        = local.lock_table_instance
    description = "Terraform remote backend state lock."
    accessed_by = "Any"
+   instance_type = "Capacity"
    tags = {
      Purpose = "Terraform state lock for state in ${local.bucket_name}:${var.state_path}/${var.state_name}"
    }
}

修正後にapplyを実行し、tfstateファイル保存のOSSバケット、及びロック管理のTableStoreインスタンスとテーブルが作成されます。

terraform apply

自動生成したterraform.tf.sampleをコピーし以下のファイルを作成します。
************の部分は前の手順で作成したOSSバケット名とTableStoreのテーブル名が自動で反映されます。

backend.tf
terraform {
    backend "oss" {
        bucket              = "terraform-remote-backend-************"
        prefix              = ""
        key                 = "prod/terraform.tfstate"
        acl                 = "private"
        region              = "ap-northeast-1"
        encrypt             = "true"
        tablestore_endpoint = "https://tf-oss-backend.ap-northeast-1.ots.aliyuncs.com"
        tablestore_table    = "terraform_remote_backend_lock_table_************"
    }
}

再度初期化コマンドを実行し、tfstateファイルをOSSにアップロードします。

terraform init

AlibabaCloud IaCの構築

以下のDemoファイルを作成し、 VPC、ECSサーバーを構築します。

main.tf
resource "alicloud_vpc" "vpc" {
  vpc_name       = "tf_test_foo"
  cidr_block = "172.16.0.0/12"
}

resource "alicloud_vswitch" "vsw" {
  vpc_id            = alicloud_vpc.vpc.id
  cidr_block        = "172.16.0.0/21"
  zone_id           = "ap-northeast-1b"
}

resource "alicloud_security_group" "default" {
  name = "default"
  vpc_id = alicloud_vpc.vpc.id
}

resource "alicloud_instance" "instance" {
  # ap-northeast-1
  availability_zone = "ap-northeast-1b"
  security_groups = alicloud_security_group.default.*.id
  # series III
  instance_type        = "ecs.t6-c2m1.large"
  system_disk_category = "cloud_efficiency"
  image_id             = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
  instance_name        = "tokyo_b_foo"
  vswitch_id = alicloud_vswitch.vsw.id
  internet_max_bandwidth_out = 10
  password = "************"
}

resource "alicloud_security_group_rule" "allow_all_tcp" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "1/65535"
  priority          = 1
  security_group_id = alicloud_security_group.default.id
  cidr_ip           = "0.0.0.0/0"
}

最後にapply

terraform apply

Discussion