【Azure】Azure Logic Appsを用いてSlackへメッセージを投稿する。

# 1. はじめに
### 1-1 ご挨拶
初めまして、井村と申します。
お仕事でAzure Loic Appsを利用することになりました。初めて触るリソースの為、動作確認と備忘録として投稿します。

### 1-2 対象読者
- Azureに興味がある

### 1-3 Azure Logic Appsとは？
Azure上で利用するローコード/ノーコードサービスです。ビジュアル デザイナーを使用してアプリ、データ、サービス、システムを統合および管理するワークフローをすばやく構築できます。基本的にコネクタと呼ばれるコンポーネントをつなぎ合わせて利用します。Azureにはたくさんの[コネクタ](https://learn.microsoft.com/ja-jp/connectors/connector-reference/connector-reference-logicapps-connectors#list-of-all-logic-apps-connectors)が用意されています。カスタムコネクタも作成できます。

### 1-4 システム構成と検証の流れ

![システム構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/fb648f4b-efdf-cec5-9b64-249b9966afae.png)

上記がシステム構成図です。検証としては以下の通り。
1. ユーザーがファイルをStorage account(コンテナー)へ格納
1. Azure Logic AppsがStorage account(コンテナー)にファイルが格納されたことを検知
1. Azure Logic AppsからSlackへメッセージ投稿＆Outlookにメール

# 2. 構築
### 2-1 Slackのアカウント作成
[こちら](https://slack.com/intl/ja-jp/pricing/free)からSlackのアカウントを作成します。今回はフリープランで問題ございません。
案件でSlackを利用する事はありますが、個人でアカウント作成するのは初めてになります。なので、エビデンスを残します。

![slack1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/3d40d8f1-6850-181d-4a0c-0b5bd92eae70.png)

今回は「Google」アカウントで作成します。

![slack2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/22474c4a-ce7a-f4e9-29b4-3322dbbb655b.png)

続けます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/02f05e67-723d-7707-89ea-516468732e48.png" width=50%>

アカウントが作成されましたので、ワークスペースを作成します。

![slack4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/f49ab385-b39f-9831-b2f0-85490ae09d5b.png)

チーム名を決めます。

![slack5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/5aed689f-4b2b-94d1-bc5c-1ce9280084b3.png)

招待はスキップします。

![slack6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/30411b5f-265a-9611-ebe3-b44caaec1dc3.png)

チャンネル名を決定します。

![slack7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/7fefa4e8-de95-945c-99b4-fd15f84a066f.png)

無事にできました。

![slack8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/e25aa45e-a4c8-431c-f342-df4070021664.png)

### 2-2 Outlookのアカウント作成
[こちら](https://outlook.live.com/owa/)からOutlookのアカウントを作成します。

### 2-3 Azure Storage Account及びAzure Logic Appsの作成
Azure portalからぽちぽちでも良いのですが、今回はTerraformで作成します。

<details><summary>main.tf</summary>

```terraform:main.tf

# プロバイダー定義
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=3.0.0"
    }
  }
}

provider "azurerm" {
  features {}
}

# 変数宣言
locals {
    common = "imura"
    location = "japaneast"
    date = formatdate("YYYYMMDD", timestamp())
}

# リソースグループの作成
resource "azurerm_resource_group" "rg" {
  name     = "rg-${local.common}"
  location = local.location
}

# Logic Appsの作成
resource "azurerm_logic_app_workflow" "logic" {
  name                = "logic-${local.common}"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  identity {
    type = "SystemAssigned"
  }
}

# Storage Accountの作成
resource "azurerm_storage_account" "st" {
  name                     = "st${local.common}${local.date}"
  resource_group_name      = azurerm_resource_group.rg.name
  location                 = azurerm_resource_group.rg.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

# コンテナーの作成
resource "azurerm_storage_container" "container" {
  name                  = "container-${local.common}"
  storage_account_name  = azurerm_storage_account.st.name
  container_access_type = "private"
}

# Azure Logic Apps→Storage Account (Storage Blob Data Reader権限)
resource "azurerm_role_assignment" "rbac" {
  scope                = azurerm_storage_account.st.id
  role_definition_name = "Storage Blob Data Reader"
  principal_id         = azurerm_logic_app_workflow.logic.identity[0].principal_id
}

```
</details>

コードにコメント入れていますので、最低限の解説だけ入れます。
ストレージアカウント名は一意である必要があるため、サフィックスにとりあえずの日付関数を使用。
ファイルを格納するコンテナーはStorage account上に作成します。
一番下のリソースブロックはAzure Logic AppsがStorage accountにアクセスすための権限付与になります。

```bash:Azure CLI
# Azureへログイン
az login

# Terraformの実行
terraform init
terraform plan
terraform apply

```

正常終了したら、リソースグループ配下にAzure Logic AppsとStorage accountが作成されます。

![rg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/1541febd-7c17-69f3-212f-2a8359448e33.png)

Storage account内のコンテナー確認。

![st1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/eece29e9-840d-daf4-2073-0d7181daee2f.png)

権限確認。

![st2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/73b65f5a-ada8-8204-cb8b-ef4ea254e60f.png)

### 2-4 ワークフローの作成
それではメインのAzure Logic Appsでワークフローを作成します。
左ペインの開発ツールから「ロジックアプリデザイナー」を選択します。
※各画面の文字が小さくてごめんなさい。

![logic01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/cf7b48a0-9841-d727-8081-dcba768d9b27.png)

「空のロジックアプリ」を選択します。

![logic02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/73337839-aa42-d072-ae32-b469ec8053c2.png)

検索窓に「Storage」と入力。トリガーから「BLOBが追加または変更されたとき」を選択します。

![logic03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/fd613898-b150-94b9-cc08-3afe2a19d581.png)

接続名は「AzureLogicAppsConnection(※任意)」、認証の種類は「Logic AppsのマネージドID」として、「作成」をクリックします。

![logic04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/1415bb53-cf87-9ca6-fe9e-4fda742a75ad.png)

「ストレージアカウント名またはBLOBエンドポイント」、「コンテナー」は作成したリソースを記述します。他の値は任意となります。今回は「項目を確認する頻度」は10分にします。各値を埋めたら、「新しいステップ」をクリックします。

![logic05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/9474ec0b-e28a-321e-afd6-0d262c84d4c5.png)

検索窓に「Slack」と入力。アクションから「メッセージの投稿」を選択します。

![logic06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/6e6fd4f3-e9c9-4df2-b734-0c1914a0bb2e.png)

「サインイン」をクリックします。

![logic07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/71a8fad8-cca5-930d-df3f-25680ae5d079.png)

作成したSlackのURLを入力し、「続行する」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/d5017753-f34f-94af-cd4e-58aa26902198.png" width=50%>


ご自身のアカウントでサインインします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/d353e9c8-d596-8ed4-dc34-576d757a9a24.png" width=50%>

「許可する」をクリックします。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/6f6d2be3-2fb2-83b4-629b-cdbd35073de1.png" width=50%>

許可されるとロジックアプリデザイナーで変化があります。各情報を入力します。

![logic11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/e72a75bd-8cde-3476-1aa1-3c1a06e1ee5b.png)

「チャネル名」は作成したチャネルを選択します。「メッセージテキスト」はフリーフォーマットで記入でき、作成したBlobの情報も取得可能です。

![logic12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/1d4a5c76-14fa-c506-0a92-d391cfb4a2ae.png)

「Add new parameter」にて「ボット名」を選択します。

![logic13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/5d362fb4-936b-172c-6737-fd3f87a70bc3.png)

上記完了したら、「新しいステップ」をクリックします。

![logic14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/64189aed-c234-c194-24ca-347cae65c9f8.png)

検索窓に「Outlook」と入力。アクションから「メールの送信」を選択します。

![logic15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/da4399e1-d2b8-e193-d811-a2653aee3ce5.png)

「サインイン」をクリックします。

![logic16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/d81828a6-fa17-8f5d-807f-6735fd18253e.png)

利用するアカウントを選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/f266e604-613a-3f21-02d6-8440f30f07e3.png" width=50%>


必須事項を入力します。

![logic18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/37e13364-ad80-e6f7-8244-384171e35257.png)

必須事項を入力後、左上の「保存」をクリックします。

![logic19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/d4beb6e1-7b56-1076-3c62-8fa621fd444b.png)

左上の「トリガーの実行」-「実行」をクリックします。

![logic20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/bfa218b0-1fca-7c6e-3c45-c21dc45896bf.png)

以上で構築完了です。

# 3. 検証
それでは検証を始めます。
「項目を確認する頻度」を10分にしたので10分毎にトリガーが動いています。
直近のトリガーは15時16分に動いていることが確認できます。

![logic21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/8a06f745-9950-0470-6e06-92b56ea0ed48.png)

### 3-1 Storage accountへファイルのアップロード
ファイルをアップロードします。時間は15時17分です。

![logic22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/069a486d-1512-197d-3473-0ffa7d67c54c.png)

### 3-2 Azure Logic Appsの確認
最新の15時26分で成功が表示されました。
※15時26分のスキップ済みのログを調査しました。ストレージアカウントの情報を取得し、メール送信時に一部処理がスキップしたようでした。よくわからん。。

![logic23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/7da9c899-a11f-5ec0-6e5b-d1032b313413.png)

実行履歴の確認すると約１秒で完了しました。

![WS000026.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/1234f849-659e-ed1c-15da-7fbac8de0b42.jpeg)


### 3-3 Slackの確認
Slackにメッセージが投稿されていることが確認できました。受信日時は15時26分です。

![logic25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/d63b7583-29d5-bee6-ee5a-2d973445828f.png)

### 3-4 Outlookの確認
メールも確認できました。受信日時は15時26分です。

![logic24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/2e84e008-8421-5a64-6d04-96dc9541cc3d.png)

最後にリソースグループを確認します。各リソースとのAPI接続リソースが作成されています。以上で検証完了です。

![logic26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/1ddaa58e-7f50-483e-51e4-7a2dee1df036.png)


# 4. 終わりに
本記事を最後まで読んで頂きましてありがとうございます。
今まで食わず嫌いのAzure Logic Appsでしたが、簡単なアプリなら短時間で作成できますね。ノーコード/ローコード市場規模が毎年右肩上がりなのがうなずけます。

# 5. 参考記事
- [すべての Logic Apps コネクタの一覧](https://learn.microsoft.com/ja-jp/connectors/connector-reference/connector-reference-logicapps-connectors#list-of-all-logic-apps-connectors)
- [Edwanderson94/timestamp-tf (timestamp関数)](https://github.com/Edwanderson94/timestamp-tf/blob/master/locals.tf)
- [【Terraform de Azure】 Azure Synapse Analytics を 作成してみました (Azure RBAC具体的な利用方法)](https://qiita.com/turupon/items/e09c43a16ab3ab9cace0)
- [azurerm_role_assignment](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/role_assignment)
- [Azureのサービス正常性アラートを、LogicAppsを経由していい感じにSlackに通知させる](https://tech.kusuwada.com/entry/2020/12/06/000000)