AzureCLIでAzureBLOBStorageの構築

# はじめに

Azure初心者です。 過去AWSのみ利用していました。
AzureCLIを用いて、オブジェクトストレージのAzureBLOBStorageを構築する際の記録です。

記載内容や画像は、[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-azure-cli)を参照しています。

## 環境

Windows10/PowerShell
 

## AzureStorageについて

AzureStorage = AWS S3　だと思っていたのだが、どうやら違うらしい。

AzureStorageは、以下のようなサービスを含むサービス群(?)であり、その中の`AzureBLOBStorage`がAWS S3のようなオブジェクトストレージに該当するサービス。

|サービス|説明|
|---|---|
|Azure BLOB|テキストおよびバイナリ データのための高度にスケーラブルなオブジェクト ストア|
|Azure ファイル|クラウドまたはオンプレミスのデプロイ用のマネージド ファイル共有|
|Azure キュー|アプリケーション コンポーネント間の信頼性の高いメッセージングのためのメッセージング ストア|
|Azure テーブル|構造化データのスキーマレス ストレージのための NoSQL ストア|

### スペックについて

AzureStorageを作成するにあたって、性能と冗長性の二面から選択する必要がある。　
`StandardのLRS`を使うのが一番安い

#### 性能

|分類|説明|
|---|---|
|Standard|通常のストレージ 安価|
|Premium|高トランザクション レートに最適化されたストレージ　高価|

#### 冗長性

|分類|日本語名称|役割|
|---|---|---|
|LRS|ローカル冗長ストレージ|シンプルな低コストのレプリケーション　安価|
|ZRS|ゾーン冗長ストレージ|1つのリージョン内の3つのストレージクラスターでのレプリケーション|
|GRS|geo 冗長ストレージ|リージョン全体のサービス停止に備えたリージョン間レプリケーション|
|GZRS|geo ゾーン冗長ストレージ|ZRSの高可用性と、GRSによって提供されるリージョン障害からの保護を融合させたレプリケーション|
|RA-GRS|読み取りアクセス geo 冗長ストレージ|読み取りアクセスも冗長化したGRS　リージョンがダウンしても読み取り可能|
|RA-GZRS|読み取りアクセス geo ゾーン冗長ストレージ|読み取りアクセスも冗長化したGZRS　リージョンがダウンしても読み取り可能|

## AzureBLOBStorageの構成

![blob1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176243/12c59646-8f2a-87e7-55aa-4e749505b538.png)

アカウント：AzureStorageアカウント
コンテナー：S3のバケットのようなもの
BLOB：各ファイル



# CLIでの構築

構築の流れ
1. ResouseGroupe の作成
2. AzureStorageの作成
3. 認証情報の設定
4. コンテナの作成
5. ファイルのアップデート/ダウンロード/削除

## Resouse Groupe の作成

![scope-levels.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176243/6a0f6772-1040-cb46-eee0-4d724b23d580.png)

> リソース グループ 
Azure ソリューションの関連するリソースを保持するコンテナー。 リソース グループには、グループとして管理するリソースが含まれます。 組織にとって最も有用になるように、どのリソースをリソース グループに含めるかを決定します。

Azureの各リソースは、リソースグループの配下に構築するようなので、リソースグループの作成から行う。

### 作成

```powershell:input
az group create --name <resource_groupe> --location <location>
```

### 確認

```powershell:input
az  group list --output table
```

```powershell:output
Name               Location       Status
----------------   -------------  ---------
<resource_groupe>  southeastasia  Succeeded
<resource_groupe>  japaneast      Succeeded
```

##  Azure Storageの作成

### 作成

#### storage作成のテンプレート

```powershell
az storage account create \
    --location <location> \
    --name <account_name> \
    --resource-group <resource_group> \
    --sku <account_sku>
    --kind <storage_type>
```

location[必須]: 場所　`japaneast`など
name[必須]: ストレージアカウント名　英小文字と数字のみで、文字数は 3 ～ 24 文字
resource-group: リソースグループの名前　configureに設定されていれば不要
sku: ストレージアカウントのSKU デフォルトは、`Standard_RAGRS`
　→ `Standard_LRS` が安いから変更
kind: ストレージのタイプ　デフォルトは`Storage`
　→ 今後 `StorageV2`に統一されるようなので変更 

>SKU（Stock Keeping Unit）:価格レベル
Premium_LRS, Premium_ZRS, Standard_GRS, Standard_GZRS, 
Standard_LRS, Standard_RAGRS, Standard_RAGZRS, Standard_ZRS


```powershell:input
az storage account create \
    --location japaneast \
    --name <storage_name> \
    --resource-group <resource_group> \
    --sku Standard_LRS \
    --kind StorageV2
```

### 確認

```powershell:input
az storage account list --output table
```

```powershell:output
AccessTier    CreationTime                      EnableHttpsTrafficOnly    Kind       Location    Name            PrimaryLocation    ProvisioningState    ResourceGroup        StatusOfPrimary
------------  --------------------------------  ------------------------  ---------  ----------  --------------  -----------------  -------------------  -------------------  -----------------
Hot           2019-10-29T03:49:54.557112+00:00  True                      StorageV2  japaneast   <storage_name>  japaneast          Succeeded            <resource_group>     available
```


## 認証情報の設定

以降の作業では認証情報が必要なので、環境変数に埋め込む。

### 認証情報取得

```powershell:input
az storage account keys list --account-name <account_name> --resource-group <resource_group> --output table
```

```powershell:output
KeyName    Permissions    Value
---------  -------------  ----------------------------
key1       Full           ****************************
key2       Full           **************************** 
```

### 環境変数への埋め込み

下記一時的な環境変数への埋め込みのため、必要であれば永続的に設定してください。

```powershell:input
$env:AZURE_STORAGE_ACCOUNT="<account_name>"
$env:AZURE_STORAGE_KEY="<account_key>"
```


## コンテナの作成

### 作成

```powershell:input
az storage container create --name <container_name>
```

認証情報設定していない場合は、`--account-name` `--account-key`を付与する。（以降のコマンドすべて）

```powershell:input
az storage container create --name <container_name>  --account-name <account_name> --account-key <account_key>
```

### 確認

```powershell:output
az storage container list --output table
```

```powershell:output
Name              Lease Status    Last Modified
----------------  --------------  -------------------------
<container_name>  unlocked        2019-10-29T04:44:11+00:00
```

## ファイルのアップデート/ダウンロード/削除

### アップロード

```powershell:input
az storage blob upload
    --container-name <container_name> \
    --file <file_path> \
    --name <blob_name>
```

### ダウンロード

```powershell:input
az storage blob download
    --container-name <container_name> \
    --file <file_path> \
    --name <blob_name>
```

### 削除

```powershell:input
az storage blob delete
    --container-name <container_name> \
    --name <blob_name>
```

### 確認

```powershell:input
az storage blob list --container-name <container_name> --output table
```

```powershell:output
Name       Blob Type    Blob Tier    Length    Content Type    Last Modified              Snapshot
---------  -----------  -----------  --------  --------------  -------------------------  ----------
<name>     BlockBlob    Hot          9763      image/png       2019-10-29T06:48:43+00:00
```