Help us understand the problem. What is going on with this article?

terraformでAzureに2階層システムを構築する

はじめに

Microsoft Azureに仮想マシンや仮想ネットワークなどを構築するにはAzureポータルを使うことができますが、クラウドの旨味を十分に活かすためにこれらを柔軟に繰り返し配備・破棄できることが開発効率化の重要なポイントとなるため、構築自動化にチャレンジします。
自動化にはAzure CLIやARMテンプレートが候補として挙がりますが、今後Azureだけでなく複数クラウドの構築自動化を見据え、Terraformを使って自動化をやってみました。

Azureの公式ドキュメントに紹介されている解説ページと、Terraform開発元のHashicorp社が公開しているexamplesテンプレートがありますので、それらを参考・流用しつつ、以下の超小規模のシステムを自動構築してみました。

スクリーンショット 2019-09-15 16.07.21.png

構築準備

本記事では任意のCentOS7の環境が準備された想定で以下の手順を記載します。

terraformをインストールする

terraform公式ドキュメントからダウンロードURLを確認しwgetで取得します。(2019/9/15現在ではterraform 0.12.8でした)

# wget https://releases.hashicorp.com/terraform/0.12.8/terraform_0.12.8_linux_amd64.zip -P /usr/local/bin
# cd /usr/local/bin
# unzip terraform_0.12.8_linux_amd64.zip
Archive:  terraform_0.12.8_linux_amd64.zip
  inflating: terraform

terraformがインストールされたか確認する

# terraform --version
Terraform v0.12.8

Azure CLIをインストールする

公式のドキュメントを参照してインストールします。

Azureの認証情報を取得する

terraformからAzureの操作を行うために事前に認証情報を取得します。
具体的にはAzure CLIでAzureにログイン後、Azure Service Principalを作成します。

Azureにloginする

# az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXX to authenticate.

コマンドで出力されたURLにブラウザでアクセスする

要求されているコードaz loginで出力されたコードを入力します。上記だとXXXXXXXに相当します。

スクリーンショット 2019-09-15 14.32.09.png

ログイン後Service PrincipalをAzure CLIで発行する

# az account list -o table
Name           CloudName    SubscriptionId                        State    IsDefault
-------------  -----------  ------------------------------------  -------  -----------
Pay-As-You-Go  AzureCloud   @@@YOUR_SUBCSRIPTION_ID@@@            Enabled  True

# SUBSCRIPTION_ID="上記で取得したSubscriptionId"
# az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}"
Creating a role assignment under the scope of "/subscriptions/@@@YOUR_SUBCSRIPTION_ID@@@"
{
  "appId": "APP_ID",
  "displayName": "azure-cli-2019-09-15-05-41-36",
  "name": "http://azure-cli-2019-09-15-05-41-36",
  "password": "PASSWORD",
  "tenant": "TENANT_ID"
}

terraformを使ってAzure上に構築する

認証情報を設定する

# export ARM_SUBSCRIPTION_ID=${SUBSCRIPTION_ID}
# export ARM_CLIENT_ID="<Service principal作成時に出力されたappId>"
# export ARM_CLIENT_SECRET="<Service principal作成時に出力されたpassword>"
# export ARM_TENANT_ID="<Service principal作成時に出力されたtenant>"

terraform templateをgitで取得する

terraformを開発しているHashicorp社がExampleを公開しているため、そちらからテンプレートを準備します。
が、、Examplesではdmz構成に1つのVMしか配備されないテンプレートのため、本記事ではExamplesを流用して拡張したテンプレートを使用します。

# cd ~
# git clone -b feature/dmzsecure https://github.com/kita-atsushi/terraform-provider-azurerm.git
# cd terraform-provider-azurerm/examples/virtual-machines/bastion-box

terraform initを実行しAzure pluginをインストールする

# terraform init

terraform applyでAzureに環境を構築する

# terraform apply -var 'location=japaneast' -var "prefix=sandbox20190915" -auto-approve

: (省略: 数分〜数十分かかります)

Apply complete! Resources: 12 added, 0 changed, 0 destroyed.

Outputs:

ssh_command = ssh testadmin@sandbox20190915-jumpserver.japaneast.cloudapp.azure.com
vm_fqdn = sandbox20190915-jumpserver.japaneast.cloudapp.azure.com

AzureポータルからもIaaSが構築されていることを確認できます。
スクリーンショット 2019-09-15 15.52.54.png

構築した仮想マシンにsshするための鍵を取得する

terraform apply後に出力されるOutputsより構築した仮想マシンにログインするためのsshコマンドが出力されますが、ssh鍵の指定が別途必要となります。ssh鍵はterraform showコマンドでテキストとして取得することができます。
ここでは以下のコマンドで鍵文字列を取得しファイルとして保存します(jqコマンド必要)。

# terraform show -json |jq -r '.values.root_module.resources[] | select(.address=="tls_private_key.jumpserver") | .values.private_key_pem' >id_rsa
# chmod 600 id_rsa

構築した仮想マシンにsshする

以下のコマンドでsshし構築したサーバにログインできます。

# ssh -i id_rsa testadmin@sandbox20190915-jumpserver.japaneast.cloudapp.azure.com

[testadmin@jump-server ~]$ hostname
jump-server
[testadmin@jump-server ~]$

以上

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away