TerraformでDigitalOcean dropletを作る(1)
この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が対応しているプロバイダー
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を平行して確認しながらインストールしましょう。
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です。
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
Discussion