なに、TerraformでSpotifyプレイリスト作成したらTシャツもらえるって!?

TerraformでSpotifyプレイリストを作成して、TwitterでつぶやけばHashicorp Tシャツがもらえるだって??

https://twitter.com/hashicorp/status/1415706509766443017?s=21&t=TRlBSCkBKlm0gSw7rEVKJw

そもそもTerraformにSpotify用のProviderがあったことがビックリですね。


# 参考にしたページ
Windows想定の記事でしたので、こちらをM1 Mac用にカスタマイズして実施していきます。

https://www.lac.co.jp/lacwatch/people/20210810_002686.html


# 環境準備
- Macbook Air（M1）でターミナルを起動

- Gitをインストール

```zsh
$ brew install git

$ git version
git version 2.37.0
```

- Terraformをインストール

```zsh
$ brew install terraform

$ terraform version
Terraform v1.2.4
on darwin_arm64
```

- Docker Desktopのインストール

https://www.docker.com/get-started/

- VS Codeのインストール

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

- Spotifyアカウント作成

https://www.spotify.com/jp/signup?forward_url=https%3A%2F%2Fopen.spotify.com%2F


# ハンズオン手順

### Spotify開発者アプリを作成

- Spotify Developers Dashboardにログインし、利用許諾に同意する

https://developer.spotify.com/dashboard/

- Create an app をクリック
    - App name：`tfspot` など適当な名前を入れる
    - App description: `tfspot` など適当な説明を入れる

- Edit settings をクリック
    - Redirect URLs: `http://localhost:27228/spotify_callback` を入力しAddをクリック
    - Saveをクリック


### 認証プロキシ用コンテナを起動

- Macのターミナルを起動し、環境変数をセット

```zsh
$ set SPOTIFY_CLIENT_REDIRECT_URI=http://localhost:27228/spotify_callback
```

- ホーム配下にワークフォルダー `tfspot` を作成

```zsh
$ cd ~
$ mkdir tfspot
```

- テキストファイル `.env` を作成し、tfspot配下に配置

```zsh:.env
SPOTIFY_CLIENT_ID=Spotify Developer Dashboardの「ClientID」
SPOTIFY_CLIENT_SECRET=Spotify Developer Dashboardの「Client Secret」
```

- 認証プロキシ用コンテナを起動

```zsh
$ docker run --rm -it -p 27228:27228 --env-file .env ghcr.io/conradludgate/spotify-auth-proxy
```

- コンテナ起動後、ターミナルの最終行に出力される `Auth URL` をコピーしブラウザーで開く
![スクリーンショット 2022-07-02 19.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/3fa2cae0-093e-d8f0-7198-d31576357052.png)

- 「同意する」をクリックし、`Authorization successful` と表示されればOK。


### Terraformを準備

- コンテナ実行中のターミナルはそのままにし、新規ターミナルのウィンドウを開く

- 以下コマンドを実行し、Spotify用Terraformのチュートリアルファイルをクローンする

```zsh
$ git clone https://github.com/hashicorp/learn-terraform-spotify.git
$ cd learn-terraform-spotify
```

- VS Codeで上記フォルダー `learn-terraform-spotify` をブラウズする
![スクリーンショット 2022-07-02 19.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/997bc142-d6cd-3304-c617-ee7a30217461.png)

- `main.tf` ファイルを編集する
    - `data` ブロック
        - `artist`、`album`、`name` の値を変更して、プレイリストに追加する曲の検索条件を絞り込んでみる
    - `resource` ブロック
        -  `name` を好きなプレイリスト名に変更してみる
        -  `tracks` は検索結果の曲数より行数が少なくなるよう、適宜コメントアウト

```terraform:main.tf
terraform {
  required_providers {
    spotify = {
      version = "~> 0.2.6"
      source  = "conradludgate/spotify"
    }
  }
}

provider "spotify" {
  api_key = var.spotify_api_key
}

data "spotify_search_track" "by_artist" {
  artist = "Nana Mizuki"
  album = "POP MASTER"
  name  = "UNBREAKABLE"
}

resource "spotify_playlist" "playlist" {
  name        = "お奈々"
  description = "This playlist was created by Terraform"
  public      = true

  tracks = [
    data.spotify_search_track.by_artist.tracks[0].id,
#    data.spotify_search_track.by_artist.tracks[1].id,
#    data.spotify_search_track.by_artist.tracks[2].id,
  ]
}
```

- `terraform.tfvars.example` ファイルを修正する
    - ファイル名を `terraform.tfvars` に変更
    - ファイル内の `...` の部分を、Dockerコンテナ起動後のターミナルに出力されている `APIKeys` の値で置き換える


### Terraformの実行

- 以下コマンドでワークスペースの初期化を実施

```zsh
$ terraform init
（中略）
Terraform has been successfully initialized!
```

- 以下コマンドでTerraformによるリソース作成を実施

```zsh
$ terraform apply
```

Terraformユーザーにはおなじみの「Plan」結果が表示される。+の記号でどのようなリソースが作成されるのかを教えてくれています。

```terraform
Terraform used the selected providers to generate the following execution plan. Resource actions
are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # spotify_playlist.playlist will be created
  + resource "spotify_playlist" "playlist" {
      + description = "This playlist was created by Terraform"
      + id          = (known after apply)
      + name        = "お奈々"
      + public      = true
      + snapshot_id = (known after apply)
      + tracks      = [
          + "3IY2GIqcVAYhaM2zn5r3vh",
        ]
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + playlist_url = (known after apply)

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: 
```

- 問題なさそうなら `yes` と入力し実行。以下が表示されれば成功。

```terraform
（前略）
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

playlist_url = "https://open.spotify.com/playlist/16bua5a1CXLQpI8vg5asJo"
```

- 出力された `playlist_url` をブラウザーで開くと、プレイリストが作成されている！
![スクリーンショット 2022-07-02 19.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/02c2ae6b-3ac2-9edd-36b8-43daeb31611c.png)


# 無事にプレイリスト作成できたら

Twitterでハッシュタグ付けてつぶやきましょう。Hashicorp Tシャツがもらえるかも!?

https://twitter.com/minorun365/status/1543243954677694464?s=21&t=q0PLth0phUuF50rhrFE0HQ

Terraform楽しい…けど普通にプレイリスト作った方が早いなと思いましたｗ
大量操作や自動化など、何らかのアイディアをもって活用すればきっと有効な使い道があるはず！！


# 後日談（オチ）

実はこの記事、諸事情あり2ヶ月ほど寝かせていたのですが、まだTシャツが送られてこないのでキャンペーン終了している疑惑がありそうです。苦笑
なんじゃそりゃ！

（最近見かけた、Tシャツ届きましたツイートは何だったんだろう…）

https://twitter.com/judithpatudith/status/1523805804268118016?s=21&t=amIGmwVSYvm4aVrwJybp2w