TerraformでAlibabaCloudのIaCを構築
利用方法
TerraformでAlibabaCloudのクラウドリソースを作成する方法は2つあります。
- Cloud Shell
- ローカルにインストール
Cloud ShellはAlibabaCloud管理コンソールの右上のアイコンもしくは以下のURLから利用可能
Cloud ShellはTerraformが標準で入っているため、本記事ではローカルにインストールするのを説明していきます。
ローカル環境設定
インストール
オフィシャルサイトからTerraformをダウンロードし、インストールします。
Macの場合はhomebrewからインストールできます。
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
Access Keyの設定
AlibabaCloudの管理コンソールでTerraform用のRAMユーザーを作成します。
RAMに必要な権限を付与し、AccessKeyとSECRETをメモします。
メモしたAccessKeyとSECRETを環境変数に設定します。
語尾に追加
# ファイルにAccessKeyとSECRETを追加
export ALICLOUD_ACCESS_KEY="************"
export ALICLOUD_SECRET_KEY="************"
source ~/.bash_profile
Providerの設定
provider.tfというファイルを作成します。
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.187.0"
}
}
}
provider "alicloud" {
profile = "default"
region = "ap-northeast-1"
}
versionのところに記載するProviderのバージョンはこちらで確認できます。
こちらの初期化コマンドを実行します。
terraform init
tfstateファイルbackendの設定(Option)
- tfstateファイルをローカルに保存
リソースの状態を管理するtfstateファイルはデフォルトでローカルに保存されます。もしローカルの保存で充分の場合はこちらの手順をスキップします。 - tfstateファイルをクラウドに保存
tfstateファイルはオブジェクトストレージOSSに保存できます。
複数人が使う場合、ロックはNoSQLのTableStoreの保存できます。
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を生成するモジュールはこちらです。
再度初期化コマンドを実行します。
terraform init
TableStoreでインスタンス作成時にデフォルトはパフォーマンス型です。
現時点で日本リージョンでパフォーマンス型はまだないです。
手動で以下のモジュールファイルを修正する必要があります。
.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のテーブル名が自動で反映されます。
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サーバーを構築します。
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