TerraformでAzure Blob Storage作成～ファイルのアップロードまでを自動化してみた

# はじめに
AWSには[Amazon S3(Simple Storage Service)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)と呼ばれるオブジェクトストレージがありますが、Azureにも[Blob Storage](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-overview)と呼ばれるオブジェクトストレージがあります。今回は、TerraformでAzure Blob Storageの作成からファイルのアップロードまでを自動化するサンプルスクリプトを作成してみましたので、ご紹介します。

# Blob Storageを使用するのに必要な物

Blob Storageを使用する場合に必要な物は、下記の2つです。Amazon S3を使用する場合とは異なり、ストレージアカウントと呼ばれるものが追加で必要になります。
* [ストレージアカウント](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-account-overview)
    *  Blob Storageだけでなく、ファイル共有、キュー、テーブル等も全てこのストレージアカウントを使ってアクセスを行います。
* データを保存するためのコンテナ
    * 　Amazon S3における[S3バケット](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#BasicsBucket)と同様なものであり、上記ストレージアカウントの中に作成します。

# 検証環境
* Windows10 Home Edition
* Terraform V1.2.2 on windows_amd64
* provider registry.terraform.io/hashicorp/azurerm v3.10.0

# 作成したサンプルスクリプト
スクリプトは下記のサイトを参考に作成しました。
[Terraform Registry for Azure Blob Storage](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_blob)
上記サイトを元に作成したサンプルスクリプトは下記になります。ファイル名はStr_Account.tfとしておきます。
```terraform:Str_Account.tf
terraform{
    required_providers{
        azurerm={
            source  = "hashicorp/azurerm"
            version = "=3.10.0"
        }
    }
}

# Configure the Microsoft Azure Provider
provider "azurerm" {
  features {}
}

# Set Local Variables
locals {
    rg_name = "My-RG"
    location_name = "Japan East"
    str_account_name = "mystraccount54683"
    str_container_name = "my-container"
    blob_name = "index.html"
    blob_local_file_path = "~/Documents/Azure/index.html"
}

# Create Resource Group
resource "azurerm_resource_group" "rg"{
    name = local.rg_name
    location = local.location_name
}

# Create an Azure Storage Account
resource "azurerm_storage_account" "stra"{
    name = local.str_account_name
    resource_group_name = azurerm_resource_group.rg.name
    location = azurerm_resource_group.rg.location
    account_kind = "StorageV2"
    account_tier = "Standard"
    account_replication_type = "LRS"
    access_tier = "Hot"
    shared_access_key_enabled = true
    tags = {
        Name = "Test"
    }
}

# Create an Azure Storage Container
resource "azurerm_storage_container" "strc"{
    name = local.str_container_name
    storage_account_name = azurerm_storage_account.stra.name
    container_access_type = "private"
}

# Create an Azure Storage Blob
resource "azurerm_storage_blob" "strb"{
    name = local.blob_name
    storage_account_name = azurerm_storage_account.stra.name
    storage_container_name = azurerm_storage_container.strc.name
    type = "Block"
    source_content = file(local.blob_local_file_path)
}
```
上記スクリプトは以下の処理を行います。
1. リソースグループを作成
2. ストレージアカウントを作成
3. ストレージアカウントの中にコンテナを作成
4. 3で作成したコンテナの中にblob(ファイル)をアップロード

汎用性を持たせるために、ストレージアカウント名やコンテナ名、アップロードするファイル名などについては、ローカル変数に設定することにしています。

# スクリプトの実行方法
* 環境作成 (ファイルのアップロードまで)
    *  terraform init、terraform plan、terraform applyの順にコマンドを実行します。
    *  terraform applyが問題なく終了したら、Azure portal等で結果を確認します。
* 環境破棄 (コンテナの削除からリソースグループの削除まで)
    *  terraform destoryコマンドを実行します。
    *  コマンドが問題なく終了したら、Azure portal等で結果を確認します。