はじめに
Terraformは、インフラストラクチャを整理して管理するためのツールです。これを使用して、DigitalOceanのDroplets、ロードバランサー、さらには他のプロバイダが提供するさまざまなサービスを管理できます。Terraformはコマンドラインインターフェイスを使用し、デスクトップまたはリモートサーバーから実行できます。
Terraformは、アプリケーション環境やデータセンターを構成するコンポーネントを記述する構成ファイルを読み取ることで機能します。その構成に基づいて、必要な状態に到達するために行う操作を記述した実行計画を生成します。その後、この計画を実行するためにTerraformを使用してインフラストラクチャを構築します。構成に変更が加えられると、Terraformは既存のインフラストラクチャを新しく記述された状態に更新するための増分計画を生成および実行できます。
このチュートリアルでは、Terraformをインストールして、DigitalOcean上に、DigitalOceanロードバランサーによってロードバランスされた2つのNginxサーバーからなるインフラストラクチャを作成し、次にDigitalOcean上にDNSエントリを追加して、ロードバランサーを指すようにします。これにより、Terraformの使用を始めることができ、自分のニーズに合ったDigitalOceanベースのインフラストラクチャを管理および展開する方法を把握できます。
注意:このチュートリアルは、Terraform 1.1.3
でテストされています。
前提条件
このチュートリアルを完了するには、次のものが必要です:
- A DigitalOcean account. If you do not have one, sign up for a new account.
- A DigitalOcean Personal Access Token, which you can create via the DigitalOcean control panel. Instructions to do that can be found at: How to Create a Personal Access Token.
- A password-less SSH key added to your DigitalOcean account, which you can create by following How To Use SSH Keys with DigitalOcean Droplets. When you add the key to your account, remember the name you give it, as you’ll need it in this tutorial. (For Terraform to accept the name of your key, it must start with a letter or underscore and may contain only letters, digits, underscores, and dashes.)
- A personal domain pointed to DigitalOcean’s nameserver, which you can do by following the tutorial, How To Point to DigitalOcean Nameservers From Common Domain Registrars.
ステップ1 — Terraformのインストール
Terraformは、デスクトップまたはリモートサーバーで実行するコマンドラインツールです。インストールするには、それをダウンロードしてPATH
に配置し、作業しているディレクトリで実行できるようにします。
まず、適切なパッケージをOSとアーキテクチャに応じて公式のダウンロードページからダウンロードします。macOSまたはLinuxを使用している場合、curl
を使用してTerraformをダウンロードできます。
macOSでは、次のコマンドを使用してTerraformをダウンロードし、ホームディレクトリに配置します:
Linuxでは、次のコマンドを使用します:
~/opt/terraform
ディレクトリを作成します:
次に、unzip
コマンドを使用してTerraformを~/opt/terraform
に展開します。Ubuntuでは、apt
を使用してunzip
をインストールできます:
次に、ダウンロードしたアーカイブを~/opt/terraform
ディレクトリに展開するためにそれを実行します。
最後に、~/opt/terraform
を PATH
環境変数に追加して、実行可能ファイルの完全なパスを指定せずに terraform
コマンドを実行できるようにします。
Linux の場合、新しいシェルが開かれるときに実行される .bashrc
内で PATH
を再定義する必要があります。編集するには、次のコマンドを実行します:
注意: macOS の場合、Bash を使用している場合は、ファイル .bash_profile
にパスを追加し、ZSH を使用している場合は .zshrc
に追加します。
ファイルの末尾に次の行を追加して、Terraform のパスを PATH に追加します。
編集が完了したら、ファイルを保存して閉じます。
Linux システムで Bash を使用している場合は、次のコマンドを実行して、新しいシェルセッションに PATH
をロードします:
macOS で Bash を使用している場合は、代わりにこのコマンドを実行します:
ZSH を使用している場合は、次のコマンドを実行します:
正しく Terraform をインストールしたことを確認するには、引数なしで terraform
コマンドを実行します:
OutputUsage: 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
test Experimental support for module integration testing
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.
次のような出力が表示されます:
Terraform がインストールされたので、DigitalOcean のリソースと連携するように構成しましょう。
ステップ2 — DigitalOcean の Terraform の設定
Terraform は、インストールできる プロバイダー を通じてさまざまなサービスプロバイダーをサポートしています。各プロバイダーには独自の仕様があり、一般的にそれは対応するサービスプロバイダーの API にマップされます。
DigitalOcean プロバイダー は、Terraform がインフラストラクチャを構築するために DigitalOcean API と対話することを可能にします。このプロバイダーは、次のようなさまざまな DigitalOcean リソースの作成をサポートしています:
- digitalocean_droplet: ドロップレット(サーバー)
- digitalocean_loadbalancer: ロードバランサー
- digitalocean_domain: DNS ドメインエントリ
- digitalocean_record: DNS レコード
Terraform は、DigitalOcean の個人アクセス トークンを使用して DigitalOcean API と通信し、アカウント内のリソースを管理します。このキーを他の人と共有せず、スクリプトやバージョン管理から外してください。次のコマンドを実行して、DigitalOcean の個人アクセス トークンを DO_PAT
という環境変数にエクスポートします:
これにより、後続のコマンドでの使用が容易になり、コードから分離されます。
注意: もしTerraformとDigitalOceanをよく使用する場合は、前のステップでPATH
環境変数を修正した方法と同じアプローチを使って、この行をシェル構成ファイルに追加してください。
以下のコマンドを実行して、インフラストラクチャ構成を格納するディレクトリを作成します:
新しく作成したディレクトリに移動します:
Terraformの構成ファイルは.tf
拡張子で終わるテキストファイルです。人間が読める形式であり、コメントもサポートされています。(TerraformはJSON形式の構成ファイルもサポートしていますが、ここではカバーしません。)Terraformは宣言的な方法で作業ディレクトリ内のすべての構成ファイルを読み込みますので、リソースと変数の定義の順序は重要ではありません。すべてのインフラストラクチャを単一の構成ファイルに記述することもできますが、明確さを保つためにリソースタイプごとに構成ファイルを分割することをお勧めします。
Terraformでインフラストラクチャを構築する最初のステップは、使用するプロバイダーを定義することです。
TerraformでDigitalOceanプロバイダーを使用するには、Terraformにそのことを伝え、適切な認証変数でプラグインを設定する必要があります。プロバイダーの構成を保存するprovider.tf
という名前のファイルを作成します:
次の行をファイルに追加して、TerraformにDigitalOceanプロバイダーを使用することを伝え、Terraformがそれを見つける場所を指示します:
次に、ファイル内で以下の変数を定義して、後続の構成ファイルで参照できるようにします:
do_token
:あなたのDigitalOceanパーソナルアクセス トークン。pvt_key
:プライベートキーの場所、Terraformが新しいDropletsにログインしてNginxをインストールできるようにします。
これらの変数の値をTerraformに実行するときに渡し、ここで値をハードコーディングする代わりに構成をより移植可能にします。
これらの変数を定義するには、ファイルにこれらの行を追加します:
次に、DigitalOceanプロバイダを構成し、プロバイダのtoken
引数にdo_token
を割り当てることで、DigitalOceanアカウントの資格情報を指定します:
最後に、Terraformに新しいDropletsにSSHキーを自動的に追加させたいと思うでしょう。DigitalOceanにSSHキーを追加するときに名前を付けました。Terraformはこの名前を使用して公開鍵を取得できます。次の行を追加し、terraform
をDigitalOceanアカウントで提供したキーの名前に置き換えます:
完了したprovider.tf
ファイルは次のようになります:
完了したら、ファイルを保存して閉じます。
注意:TF_LOG
環境変数を1
に設定すると、Terraformが試行する操作の詳細なログが有効になります。次のようにして設定できます:
プロジェクトのTerraformを初期化するには、次のコマンドを実行します:
これにより、構成が読み込まれ、プロバイダのプラグインがインストールされます。出力にログインしているのが見えるでしょう:
OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.16.0...
- Installed digitalocean/digitalocean v2.16.0 (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が予想通りに動作しない場合、terraform.tfstate
ファイルを削除し、手動で作成されたリソース(例:コントロールパネルを介して)を破棄して、最初からやり直すことができます。
Terraformが構成され、DigitalOceanアカウントに接続できるようになりました。次のステップでは、Terraformを使用してNginxサーバーを実行するDropletを定義します。
ステップ3 — 最初のNginxサーバーを定義する
Terraformを使用してDigitalOcean Dropletを作成し、Dropletが起動した後にソフトウェアをインストールできます。このステップでは、Ubuntu 20.04 Dropletを1つ作成し、Terraformを使用してNginxウェブサーバーをインストールします。
www-1.tf
という新しいTerraform構成ファイルを作成し、Dropletの構成を保持します。
次の行を挿入して、Dropletリソースを定義します:
前述の構成では、最初の行でwww-1
という名前のdigitalocean_dropletリソースが定義されています。残りの行では、Dropletの属性が指定されており、それにはDropletが存在するデータセンターと、構成するDropletのサイズを識別するスラグが含まれています。この場合、1つのCPUと1GBのRAMを持つDropletを作成するs-1vcpu-1gb
を使用しています。(使用可能なスラグの一覧については、このサイズスラグ表を参照してください。)
ssh_keys
セクションは、Dropletに追加したい公開鍵のリストを指定します。この場合、provider.tf
で定義したキーを指定しています。ここでの名前がprovider.tf
で指定した名前と一致することを確認してください。
TerraformをDigitalOcean APIに対して実行すると、Dropletに関するさまざまな情報(パブリックおよびプライベートIPアドレスなど)が収集されます。この情報は、構成内の他のリソースで使用できます。
Dropletリソースに必要またはオプションの引数がどれであるか疑問に思う場合は、公式のTerraformドキュメントを参照してください:DigitalOcean Droplet Specification。
TerraformがSSH経由でサーバーに接続するために使用できるconnection
を設定するには、ファイルの最後に次の行を追加します。
これらの行は、Terraformがサーバーに接続する方法を説明しています。Terraformは、SSH経由でNginxをインストールするためにこれを使用できます。プライベートキー変数var.pvt_key
の使用に注目してください。Terraformを実行する際にその値を渡します。
これで接続が設定されたので、Nginxをインストールするために使用するremote-exec
プロビジョナーを構成します。そのためには、次の行を構成に追加します。
rootユーザーがNginxをインストールするために実行するコマンドがinline
配列内の文字列であることに注意してください。
完成したファイルは次のようになります。
ファイルを保存してエディターを終了します。サーバーを定義し、準備が整ったので、それを展開します。
ステップ 4 — Terraform を使用して Nginx サーバーを作成する
現在の Terraform 構成は単一の Nginx サーバーを記述しています。これを定義どおりにドロップレットに展開します。
terraform plan
コマンドを実行して、実行計画(Terraform がインフラストラクチャを構築するために試みる内容)を確認します。DigitalOcean のアクセス トークンの値と秘密鍵のパスを指定する必要があります。なぜなら、構成はこれらの情報を使用してドロップレットにアクセスして Nginx をインストールするためです。次のコマンドを実行して計画を作成します:
警告: terraform plan
コマンドは、プランを保存するための -out
パラメーターをサポートしています。ただし、プランには API キーが含まれ、Terraform はこのデータを暗号化しません。このオプションを使用する場合は、このファイルを他の人に送信するか、長期間保存する場合には、このファイルを暗号化することを検討する必要があります。
次のような出力が表示されます:
+ リソース "digitalocean_droplet" "www-1"
行は、Terraform が後に続く詳細を持つ www-1
という名前の新しい Droplet リソースを作成することを意味します。 それが起こるべきことですので、現在の計画を実行するには、terraform apply
コマンドを実行してください。
以前と同じ出力が得られますが、今回は Terraform が進行するかどうかを尋ねられます。
Output...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
yes
を入力し、ENTER
キーを押してください。 Terraform は Droplet をプロビジョニングします。
Outputdigitalocean_droplet.www-1: Creating...
しばらくしてから、Terraform が remote-exec
プロビジョナーを使用して Nginx をインストールし、その後、プロセスが完了します。
Output
digitalocean_droplet.www-1: Provisioning with 'remote-exec'...
....
digitalocean_droplet.www-1: Creation complete after 1m54s [id=your_www-1_droplet_id]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...
Terraform は新しい Droplet で Nginx をインストールしました。 新しい Droplet のパブリック IP アドレスにアクセスすると、Nginx のウェルカム画面が表示されます。 Droplet が作成されたときにパブリック IP が表示されましたが、Terraform の現在の状態を見ることで常に表示できます。 Terraform は、計画を実行するか状態を更新するたびに状態ファイル terraform.tfstate
を更新します。
環境の現在の状態を表示するには、次のコマンドを使用してください:
これにより、Droplet のパブリック IP アドレスが表示されます。
ブラウザで http://your_www-1_server_ip
に移動して、Nginx サーバーが実行されていることを確認してください。
注意: Terraformのインフラストラクチャを変更する場合、状態ファイルが最新ではなくなります。Terraformの外部でリソースが変更された場合、状態ファイルを更新して最新の状態にする必要があります。このコマンドは、プロバイダーから更新されたリソース情報を取得します:
このステップでは、Terraformで説明したDropletを展開しました。これから第二のDropletを作成します。
ステップ5 — 第二のNginxサーバーの作成
すでにNginxサーバーを説明したので、既存のサーバーの設定ファイルをコピーして名前とホスト名を置換することで、簡単に第二のサーバーを追加できます。
これは手動で行うこともできますが、sed
コマンドを使用してwww-1.tf
ファイルを読み取り、すべてのwww-1
をwww-2
に置換し、www-2.tf
という新しいファイルを作成する方が速いです。以下はそのためのsed
コマンドです:
sed
について詳しくは、Using sedをご覧ください。
terraform plan
を再実行して、Terraformが行う変更をプレビューします:
出力によると、Terraformは第二のサーバーwww-2
を作成します:
terraform apply
を再実行して2番目のDropletを作成します。
前回同様、Terraformは継続することを確認するように求めます。計画を再度確認し、継続するにはyes
と入力してください。
しばらくすると、Terraformが新しいサーバーを作成し、結果を表示します。
Outputdigitalocean_droplet.www-2: Creation complete after 1m47s [id=your_www-2_droplet_id]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Terraformは新しいサーバーを作成し、既存のものを変更しませんでした。追加のNginxサーバーを追加するには、この手順を繰り返すことができます。
これで、Nginxを実行する2つのDropletがあるので、トラフィックを分散するロードバランサーを定義して展開します。
ステップ6 — ロードバランサーの作成
公式のTerraformプロバイダーがサポートしているDigitalOcean Load Balancerを使用して、2つのWebサーバー間のトラフィックをルーティングします。
loadbalancer.tf
という新しいTerraform構成ファイルを作成します:
次の行を追加して、ロードバランサーを定義します:
ロードバランサーの定義では、その名前、所在地のデータセンター、トラフィックをバランスするためにリッスンするポート、ヘルスチェックの構成、およびTerraform変数を使用して取得したバランスするDropletのIDが指定されています。ファイルを保存して閉じます。
terraform plan
コマンドを再度実行して、新しい実行計画を確認します。
出力のいくつかの行が表示されます。以下の行が含まれます:
これは、www-1
と www-2
のドロップレットがすでに存在し、Terraform が www-lb
ロードバランサを作成することを意味します。
ロードバランサを構築するには、terraform apply
を実行してください:
再度、Terraform は計画を確認するように求めます。計画を承認するには、yes
を入力して続行してください。
承認すると、以下の行が含まれる出力が表示されます(簡潔にするために切り詰められています):
Output...
digitalocean_loadbalancer.www-lb: Creating...
...
digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...
terraform show terraform.tfstate
を使用して、ロードバランサの IP アドレスを特定します:
IP は www-lb
エントリの下にあります:
ブラウザで http://your_load_balancer_ip
に移動すると、Nginx のウェルカム画面が表示されます。これは、ロードバランサが 2 つの Nginx サーバのうちの1つにトラフィックを送信しているためです。
これで、Terraform を使用して DigitalOcean アカウントの DNS を設定する方法を学びます。
ステップ 7 — DNS ドメインとレコードの作成
Dropletsとロードバランサーに加えて、TerraformはDNSドメインとレコードドメインも作成できます。たとえば、ドメインをロードバランサーにポイントさせたい場合は、その関係を記述する構成を記述できます。
注意:独自のユニークなドメイン名を使用するか、TerraformはDNSリソースをデプロイできません。ドメインがDigitalOceanの名前サーバーを指していることを確認してください。
新しいファイルを作成してDNSを記述します:
次のドメインリソースを追加し、your_domain
をご自分のドメイン名に置き換えます:
完了したら、ファイルを保存して閉じます。
www.your_domain
をyour_domain
にポイントするCNAMEレコードも追加できます。CNAMEレコード用の新しいファイルを作成します:
次の行をファイルに追加します:
完了したら、ファイルを保存して閉じます。
DNSエントリを追加するには、他のリソースと同様に、terraform plan
を実行してからterraform apply
を実行します。
ドメイン名に移動すると、ドメインがロードバランサーを指しており、そのロードバランサーが2つのNginxサーバーのうちの1つにトラフィックを送信しているため、Nginxのウェルカム画面が表示されます。
ステップ8 — インフラストラクチャの破棄
一般のプロダクション環境ではあまり使われていませんが、Terraformは作成したインフラストラクチャを破壊することもできます。これは、何度も展開および破棄される開発環境で主に役立ちます。
まず、terraform plan -destroy
を使用してインフラストラクチャを破壊する実行計画を作成します:
Terraformは、リソースが赤でマークされ、マイナス記号が付いている実行計画を出力します。これは、インフラストラクチャ内のリソースを削除することを示しています。
次に、terraform apply
を使用して計画を実行します:
Terraformは、生成された計画で示されているように、リソースを破壊し続けます。
結論
このチュートリアルでは、DigitalOcean上で負荷分散されたWebインフラストラクチャを構築するためにTerraformを使用しました。これには、DigitalOceanロードバランサーの背後で実行される2つのNginx Webサーバーが含まれます。現在の状態を表示し、Terraformを使用してDNSエントリを設定する方法を知っています。
これで、Terraformがどのように機能するかを理解したので、独自のプロジェクトのサーバーインフラストラクチャを記述する構成ファイルを作成できます。このチュートリアルの例は、サーバーの展開を自動化する方法を示す良い出発点です。既存のプロビジョニングツールをすでに使用している場合は、このチュートリアルで使用されているプロビジョニング方法の代わりに、サーバーを構成するためにそれらをTerraformと統合して作成プロセスの一部として使用できます。
Terraformにはさらに多くの機能があり、他のプロバイダーと連携できます。Terraformを使用して独自のインフラストラクチャを改善する方法については、公式のTerraformドキュメントを参照してください。
このチュートリアルは、Terraformでインフラストラクチャを管理する方法シリーズの一部です。このシリーズでは、Terraformを初めてインストールする方法から複雑なプロジェクトを管理する方法まで、さまざまなTerraformのトピックをカバーしています。
Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean