[Azure] GitHub Actions で az コマンドを定期的にたたく

GitHub Actions を使うと、Azure CLI コマンド (az コマンド) の自動実行を実現することができます。
この記事では、以下のドキュメントを参考に VM の起動をスケジュール化してみたいと思います。
https://github.com/marketplace/actions/azure-cli-action

なお、事前に GitHub アカウントと Azure 上に VM を作成している前提で進めます。

##1. GitHub リポジトリを作成する
まずは、以下のドキュメントを参考にリポジトリを作成しましょう。
https://docs.github.com/ja/free-pro-team@latest/github/getting-started-with-github/create-a-repo

今回は、Private リポジトリで試してみます。
![2020-11-16_23h31_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/f7fea0c5-9eba-bf94-6b49-a72be85b40e4.png)

##2. ワークフローを作成する
`Actions` タブから `Simple workflow` を選択します。
![2020-11-16_23h37_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/0f3ec0a5-ab5a-3c07-2735-1472e93a4872.png)

ファイル編集画面に遷移しますので、以下の YAML をペーストします。
`<RG 名>` と `<VM 名>` には起動する VM のリソースグループ名とマシン名に書き換えてください。

```yaml
name: schedule_vm_start

on:
  schedule:
    - cron: '0 0 * * *' 
  # 以下の記述でワークフローの手動実行も可能になります
  workflow_dispatch:
      
jobs:

  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    
    # Azure にログインする
    - name: Azure Login
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
    
    # az コマンドを実行する
    - name: Azure CLI script
      uses: azure/CLI@v1
      with:
        azcliversion: 2.0.72
        # <RG 名> と <VM 名> を書き換える
        inlineScript: |
          az vm start -g <RG 名> -n <VM 名>
```

スケジュールは cron 構文で記載し、UTC 時間での設定となります。(上記では、UTC 0:00 / JST 9:00)
ワークフローにおける cron 構文については以下のドキュメントに記載があります。
https://docs.github.com/ja/free-pro-team@latest/actions/reference/events-that-trigger-workflows

また、YAML ファイル全体の構文については、以下を参照してください。
https://docs.github.com/ja/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions

#3. Azure credential を設定する
Azure へログインするためのサービスプリンシパルを作成して、`${{ secrets.AZURE_CREDENTIALS }}` にシークレット情報を反映できるように設定していきます。
ドキュメントを参考に、以下のコマンドを Azure Cloud Shell などで実行し、サービスプリンシパルを作成します。
https://github.com/marketplace/actions/azure-cli-action#configure-azure-credentials-as-github-secret

```bash
az ad sp create-for-rbac --name "myApp" --role contributor \
                         --scopes /subscriptions/{subscription-id}/resourceGroups/{resource-group} \
                         --sdk-auth

# コマンド実行結果
{
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    (...)
}
```
コマンド実行結果の JSON をすべてコピーします。
その後、GitHub に戻り、`Settings > Secrets > New repository secret` と選択します。
![2020-11-16_23h55_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/aef7e0d8-95a0-6ddb-812e-1b0e9c6d8b09.png)

New secret 画面にて、Name に `AZURE_CREDENTIALS` を、Value に先ほどコピーしたコマンド実行結果 (JSON) を全て貼り付けて `Add secret` で登録します。
![2020-11-16_23h58_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/3c293389-ee6c-550e-2585-4458e1503dda.png)

## 4. ワークフローの実行を確認する
GitHub の `Actions` タブに戻ると、2.で作成したワークフローが表示されています。
`workflow_dispatch` の記述により、以下のように手動実行のためのボタンが表示されますので、実行してみましょう。
![2020-11-17_00h24_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/4f4d7aef-8d23-f0bb-4d1e-d7a8ba9c5abe.png)


問題無く実行されると、該当の VM が起動されているはずですので Azure Portal などで確認してみましょう。

また、スケジュールで設定していた時間に起動していることも確認しましょう。
`Actions` タブで実行履歴を確認できます。
![2020-11-17_11h46_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/fd79a647-425d-2a2c-ee34-953d9642c4b9.png)

## 最後に
GitHub Actionsでは CI/CD ワークフローの他、今回紹介したような Azure リソースの管理みたいなことも可能だということがわかりました。

GitHub Acrions の料金体系はパブリックリポジトリでは無料、プライベートリポジトリではプランによって無料枠 (Free プランでは 2000 分/月) が存在しており、通常利用ではほとんどお金がかからないので積極的に活用してみようと思います。
https://github.co.jp/features/actions

## 参考資料

- GitHub Actions 公式ドキュメント : https://docs.github.com/ja/free-pro-team@latest/actions
- Azure CLI Action : https://github.com/marketplace/actions/azure-cli-action