TerraformでDigitalOcean dropletを作る(1)

2021/02/11に公開

このTutrialは、2章構成です。
TerraformでDigitalOcean dropletを作る(1)
TerraformでDigitalOcean dropletを作る(2)

はじめに

ニッチクラウドの雄DigitalOceanに入信しましたのでTerraformでDropletを作成してみました。いろんなことをやってみたいなと思いつつ、まずはインフラ仕事から、こつこつと…。

DigitalOceanって

米ニューヨークに本拠地を置くクラウド事業会社・サービス。起動が早くAPI関連の仕様が新しい。
日本にサーバーがありませんので日本ではあまり話題になっておらず、日本に一番近いシンガポールのデータセンターを使ってサービスを受けます。

Terraformって

HashiCorp社が提供するTerraformは、IaC(Infrastructure as Code)を実現するツールです。ユーザーは利用無料です。インフラをコードで書くと何がいいかというと、設定変更作業をコードで管理することで手作業による間違いを防ぐこと設定変更作業を自動化することで、大量のサーバーに設定変更を反映できたりします。DigitalOceanでは、Droplet、ロードバランサー、DNSを管理できます。

Terraformが対応しているプロバイダー

https://registry.terraform.io/browse/providers

Dropletって

AWS EC2のようなハイパーバイザー型の仮想サーバーです。Terraformでコードを書き、Dropletを作ります。

何にインストールするか?

Dropletのデフォルトイメージは
- Ubuntu
- FreeBSD
- Fedora
- Debian
- CentOS
- RancherOS

があります。とりあえず仕事での構築を意識してCentOS8.3で構築してみましょう。右上ボタンCreateを押してDropletを作成します。

Terraform のインストール

https://releases.hashicorp.com/terraform 
で最新のバージョンを調べます。今日現在では、0.14.6ですのでWgetで取得しましょう。
ここ以降は、公式の引用でだいたいうまくいったので、下記URLを平行して確認しながらインストールしましょう。

https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean.amp

OS作り立てなので wgetとunzipとcurl,nano,jqをまとめてインストールします。

yum install -y sudo wget unzip curl nano jq

terraformをインストールする。パスを書いておく。

wget https://releases.hashicorp.com/terraform/0.14.6/terraform_0.14.6_linux_amd64.zip
mkdir -p ~/opt/terraform
unzip terraform_0.14.6_linux_amd64.zip -d ~/opt/terraform/
echo "export PATH=$PATH:~/opt/terraform" >> ~/.bashrc
source ~/.bashrc

terraform -v
# => "Terraform v0.14.6" と表示

コマンド一覧

terraform 
Usage: terraform [global options] <subcommand> [args]

The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.

Main commands:
  init          Prepare your working directory for other commands
  validate      Check whether the configuration is valid
  plan          Show changes required by the current configuration
  apply         Create or update infrastructure
  destroy       Destroy previously-created infrastructure

All other commands:
  console       Try Terraform expressions at an interactive command prompt
  fmt           Reformat your configuration in the standard style
  force-unlock  Release a stuck lock on the current workspace
  get           Install or upgrade remote Terraform modules
  graph         Generate a Graphviz graph of the steps in an operation
  import        Associate existing infrastructure with a Terraform resource
  login         Obtain and save credentials for a remote host
  logout        Remove locally-stored credentials for a remote host
  output        Show output values from your root module
  providers     Show the providers required for this configuration
  refresh       Update the state to match remote systems
  show          Show the current state or a saved plan
  state         Advanced state management
  taint         Mark a resource instance as not fully functional
  untaint       Remove the 'tainted' state from a resource instance
  version       Show the current Terraform version
  workspace     Workspace management

Global options (use these before the subcommand, if any):
  -chdir=DIR    Switch to a different working directory before executing the
                given subcommand.
  -help         Show this help output, or the help for a specified subcommand.
  -version      An alias for the "version" subcommand.

公開鍵を作成する。

公開鍵を作成します。

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxx root@centos-s-1vcpu-1gb-sgp1-01
The key's randomart image is:
+---[RSA 3072]----+
|        .o O=E+&^|
|         .*.B.oO/|
|        o  ..o+*X|
|       o .     B*|
|               .o|
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+

作成されているか中身を確認。

cat ~/.ssh/id_rsa.pub
ssh-rsa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa= root@centos-s-1vcpu-1gb-sgp1-01

DigitalOceanのサイトに登録します。
サイト右上の丸いProfileのメニューにMyProfileからSecurityを選択SSHKeyフォームを開きます。


id_rsa.pubの中身をすべてコピーし、Edit SSHKeyに登録します。
名前[name]をterraformで登録します。

作業用ディレクトリを作成-provider.tfの作成

このファイルで使っている文法はここ

mkdir droplet
cd droplet
nano provider.tf

provider.tfの内容

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "1.22.2"
    }
  }
}

variable "do_token" {}
variable "pvt_key" {}

provider "digitalocean" {
  token = var.do_token
}

data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

ここで内容の説明。terraformでは、使えるサービスがそろぞれproviderで違うので、このproviderだよという定義が必要になります。providerのバージョンは、最新を確認しましょう。digitaloceanの最新バージョンは1.22.2です。

https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs

variable "do_token" {}
variable "pvt_key" {}

ファイルに次の変数を定義して、残りの構成ファイルで参照できるようにします。

do_token:DigitalOceanパーソナルアクセストークン

pvt_key:秘密鍵。Terraformはそれを使用して新しいドロップレットにログインしOSをインストールできます。

次の行を追加してDigitalOceanプロバイダーを構成し、do_token変数に「token」を割り当ててDigitalOceanアカウントの資格情報を指定します。

provider "digitalocean" {
  token = var.do_token
}

値をハードコーディングするのではなく、実行時にこれらの変数の値をterraformに渡します。変数化することで構成の移植性が向上します。name="terraform"の値は先ほど登録したEdit SSHKeyの値が代入されます。

data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

ファイルを保存して、エディターを終了します。
次に、プロジェクトのTerraformを初期化(init)します。これにより、構成が読み取られ、プロバイダーのプラグインがインストールされます。

terraform init
Initializing the backend...

Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "1.22.2"...
- Installing digitalocean/digitalocean v1.22.2...
- Installed digitalocean/digitalocean v1.22.2 (signed by a HashiCorp partner, key ID F82037E524B9C0E8)

Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html

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.

これでterraform Providerの登録が完了します。terraformのバージョンを確認します。
下記のように登録されていれば、digitalocean内にterraformを使用してインフラが構築できます。

terraform version
Terraform v0.14.6
+ provider registry.terraform.io/digitalocean/digitalocean v1.22.2

TerraformでDigitalOcean dropletを作る(2)に続きます

Discussion