「クラウドネイティブの ASP.NET Core マイクロサービスを作成してデプロイする」 をやってみる

この記事は、[求ム！Cloud Nativeアプリケーション開発のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-cloudnative) 初日です。

<font color="purple">$\huge{ありがとうございます！}$</font>
[日本マイクロソフト賞 ④](https://qiita.com/chomado/items/7d1f757f18c5b442fadd#%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E8%B3%9E-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%81%AE-aspnet-core-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B-%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-torifukukaiou-%E3%81%95%E3%82%93)受賞記事です:tada::tada::tada:
もう一度言います。
<font color="purple">$\huge{日本マイクロソフト賞 ④ 受賞記事です}$</font>


----

# はじめに
- [求ム！Cloud Nativeアプリケーション開発のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-cloudnative) に参加してみます
- 記事執筆直前に[Azure](https://azure.microsoft.com/ja-jp/)のアカウントを作成した、「クラウドネイティブ」
て言葉は見聞きしたことあるけれどどんなものかさっぱりわかっていませんが、[アドベントカレンダー](https://qiita.com/advent-calendar/2020/azure-cloudnative)をきっかけになにかやってみようとおもいました
    - 私は`@outlook.jp`のメールアドレスをもっていたのでそのメールアドレスで[Azure](https://azure.microsoft.com/ja-jp/)のアカウントを作成しました

# [クラウドネイティブの ASP.NET Core マイクロサービスを作成してデプロイする](https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/)
- リンク先の演習をやってみることにします
- このリンク先にどうやってたどり着いたのかについては`クラウドネイティブ Azure`等でグーグル先生に聞いて、[https://docs.microsoft.com/ja-jp/dotnet/architecture/](https://docs.microsoft.com/ja-jp/dotnet/architecture/)にたどり着きまして`LEARN`ってところに目をつけた次第です

![スクリーンショット 2020-11-23 12.31.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/b50c2fe9-21fa-8741-a070-902bd6cb729d.png)


[https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/](https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/)

## 共通点!?
- `中級` => `中年`
- `ソリューション アーキテクト` => [`AWS ソリューションアーキテクト(アソシエイト)`](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)なら取得済(ギリギリ :sweat_smile:)
- [Docker](https://www.docker.com/)は使った事があるといえばありますが、もっぱらローカルマシンでの開発環境用として使う程度でございまして、(**また[AWS](https://aws.amazon.com/jp/)の話をして申し訳ありません :bow: が**)[ECS](https://aws.amazon.com/jp/ecs/)を使って本番運用をした経験はございません
- 他は聞いたことがあるくらい
- なレベル感ですがとりあえずやっていきます

## 急がばまわれ
### [Hello World マイクロサービスのチュートリアル](https://dotnet.microsoft.com/learn/aspnet/microservice-tutorial/intro)
- `LEARN`の並び的には先にこちらをやるような感じなのでやってみました
- `.NET SDK`をローカルマシンにインストールしてすべてローカルで行う演習です
- `.NET SDK`をインストールして`Hello, World`的アプリ(API)を作成してローカルで動作確認したところで、`Docker image`を作り、そのイメージから起動したコンテナでAPIアプリが動作することを確認します
- リンク先は英語ですが、特につまるところはありませんでした
- **These are the fundamental building blocks of microservices.** を身につけたのであります！
- 私の環境
    - macOS Catalina(10.15.7)で行いました
    - [Docker](https://www.docker.com/)は演習前にインストール済でした
        - Docker version 19.03.13, build 4484c46d9d

# [クラウドネイティブの ASP.NET Core マイクロサービスを作成してデプロイする](https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/)
- それではあらためて進めていきます！
- 基本的には書いてある通りに進めていけばこんな素敵なものができあがります！

## アーキテクチャ

![eshop-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/fb71250a-6040-9014-58a6-208ff6ed1b03.png)
[https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/3-solution-architecture](https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/3-solution-architecture)

- マイクロサービス アーキテクチャでは、**マイクロサービスごとに、ワークロード、ストレージ ニーズ、読み取りまたは書き込みパターンに最適化されたデータ ストアを実装する。** とのことです
- Each microservice implements its own data store that's best optimized for its workload, storage needs, and read/write patterns.

## WebStatus

![スクリーンショット 2020-11-23 0.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/86de700a-820a-89ce-e66a-7fd092f14ddf.png)


## Web SPA アプリケーション

![eshop-spa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/a9db3a3b-9510-e6a2-a9be-95e36c172971.png)
[https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/4-review-code-verify-deployment](https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/4-review-code-verify-deployment)


- 以下、私が詰まったところを書いておきます

## [ユニット 6/9 演習 - クーポン サービスを追加する](https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/6-add-coupon-service)
- ここはソースコードを書き換える演習があります
- 「2. Startup.cs で次の変更を適用して、リアルタイムの HTTP 正常性チェックをクーポン サービスに追加します。」のところが日本語版だと一体何をしたらいいのか私にはさっぱりわかりませんでした
    - C#に堪能な方であれば周辺、関連するところ(探すのがたいへんそう)を読むことでわかるのかもしれません
    - 2021/01/15 追記: 日本語訳のほうにもソースコードの変更箇所が明示されているようです :tada::tada::tada: 
- 英語版を読んだほうがいいだろうとおもいましたがどこで英語に切り替えるかすぐにはわかりませんでした
- アドレスバーをよくみると
    - `https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/6-add-coupon-service`
- ですので、`ja-jp`を`en-us`にでも変えればいいだろう！　→　🎯でした！
- [https://docs.microsoft.com/en-us/learn/modules/microservices-aspnet-core/6-add-coupon-service](https://docs.microsoft.com/en-us/learn/modules/microservices-aspnet-core/6-add-coupon-service)を参照すると、どこをどう修正すればよいのかばっちりわかります

### Container Registry でクーポン サービスを構築する
- 同じページの下のほうに、↑節があります
- そこで`az acr build --registry eshoplearn \...`というコマンドを実行するように指示されているのですがそのまま実行するとエラーになります

![スクリーンショット 2020-11-23 0.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/8bf9e534-ffc0-7539-6604-39a9ae81d950.png)

- **`eshoplearn`**なんて**知らぬ**と言われています
    - `The --registry parameter specifies the name of the container registry to use.`と書いてあるので、自身の環境にあわせて名前を指定する必要があるということが示唆されています
- [Azure](https://azure.microsoft.com/ja-jp/)の[コンソール](https://portal.azure.com/#home)で`サブスクリプション > サブスクリプション名 > リソース`と進みます

![スクリーンショット 2020-11-23 0.26.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/45c3c3ff-efef-983b-598e-5cfa14b9e1be.png)

- こういうページにたどり着くのでコンテナレジストリの名前を指定します
    - 上記例では`eshoplearn20201122150006222`となります
- (私はこれに気づく前にサブスクリプションのプランを`無料プラン`から`従量課金制`に変えてしまいましたが、変える必要はなかったのかもしれません。)

# Wrapping Up :santa: :santa_tone1: :santa_tone2: :santa_tone3: :santa_tone4: :santa_tone5:
- 求められているTips! とは異なるでしょうし、そんな当たり前のことを今さらいわれてもねー　感はあるとおもいますが、Tipsをまとめておきます
    - **公式ドキュメントを読むのは良い学習法ーーほとんどの場合において最良だと私はおもいます**
        - とっかかりはやさしめの記事や書籍だとしても、いずれはやっぱり公式ドキュメント
    - **日本語訳がおかしいとおもったら英語版を探してみると答えがあるかもね**
- **この演習では、次のことを行いました。**とのことです！
    - Azure Kubernetes Service (AKS) で実行される既存の ASP.NET Core マイクロサービスを調べました。
    - 新しい ASP.NET Core マイクロサービスを実装し、コンテナー化しました。
    - Docker イメージを Azure Container Registry に発行しました。
    - Docker コンテナーを AKS 内の既存のアプリにデプロイしました。
        - 私にはまだピンと来ていませんが、分かる人にはわかるのでしょう
        - ↑と当初はおもっていたのですがその後、[Phoenix](https://www.phoenixframework.org/)アプリを[Azure コンテナーサービス](https://docs.microsoft.com/ja-jp/azure/containers/)で動かすということを通じてなんとなくわかってきました(詳細後述)
- この記事では、「なんとなく雰囲気触ってみましたー！」しかできませんでしたし、**クラウドネイティブは何者だ？　カラオケはあるけれどかける機械を見だごとア無エ**なのですが、いつか触ろう触ろうと思っていてなかなか手がでなかった[Azure](https://azure.microsoft.com/ja-jp/)を触ってみることはできましたし、最近のシステム開発ってこうやるんだー　という雰囲気を私自身はつかめました
    - こういう設計をするものって、それを取りまとめる人はたいへんなのじゃないかなあー
    - 責務といいますかインターフェースといいますか、これはぼく、ここから先はあなたねの境界が重要なのだろうなあ
    - とおもいました
- 「ソースコードを書き換える演習」のところは日本語訳を`en-us`の記述に寄せたほうがよさそうなことについては、[問題を報告](https://docs.microsoft.com/ja-jp/learn/support/troubleshooting?uid=learn.microservices-aspnet-core.6-add-coupon-service&documentId=43a9da91-426f-2a3a-8493-0e147105c83b&versionIndependentDocumentId=4a571242-0777-d78a-ef54-5e45424547ae&contentPath=%2FMicrosoftDocs%2Flearn-pr.ja-JP%2Fblob%2Flive%2Flearn-pr%2Faspnetcore%2Fmicroservices-aspnet-core%2F6-add-coupon-service.yml&url=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Flearn%2Fmodules%2Fmicroservices-aspnet-core%2F6-add-coupon-service&author=casoper#report-feedback)から報告をしておきました

![スクリーンショット 2020-11-23 1.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/66617853-b22b-47c0-a24a-9013799c8f35.png)

# おまけ ①
- 途中、サブスクリプションのプランを`無料プラン`から`従量課金制`に変えてしまって、元に戻せないかとがちゃがちゃ、「サブスクリプションの取り消し」や「再アクティブ化」を繰り返したりしました
- 「サブスクリプションの取り消し」で`無料プラン`へ戻るのかとおもったりしたのですが、これはそんな私の都合にあわせてくれるものではなく、文字通り**サブスクリプションを取り消す**もの　→　コマンド実行しようとしてもRead Onlyで書き込み不可みたいなことになる　ものでした
- そのときの話を少し書いておきます
- 「再アクティブ化」は反映されるまで10分〜30分かかるようです
- 「再アクティブ化」後、もう一回やり直そうとファイルを消そうとしたのですが、パーミッションも所有権も特に不審なところはないのに消せないファイルが残ってしまいました
    - Azure Cloud Shellの再起動で解決しました
- もう一回やり直したいときには、[ユニット 2/9 演習 - 環境を設定する](https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/2-deploy-application)に書いてあるスクリプトでリセットできます

# おまけ ②
- ユニット [1/9 はじめに](https://docs.microsoft.com/ja-jp/learn/modules/microservices-aspnet-core/1-introduction)にこの演習に必要な料金の[見積もり](https://aka.ms/microservices-aspnet-core-estimate)が書いてあります
- おそらくデプロイしたものを4h稼働し続けた場合の料金だとおもいます
- 見積もりでは$0.63(≒72円)となっています
- 演習の最後に「Azure リソースを削除する」という節があるので、不要な料金の発生を回避するためには忘れずに行ってください
- で、私の場合はいくらかかったのかというと、11.81円でした
    - (ややみるタイミングが早すぎたのかもしれません。他の用途でも使いはじめてどこまでが本演習の分かはよくわからなくなっているのですが70円はかかっていないとおもいます)
- はじめて[Azure](https://azure.microsoft.com/ja-jp/)アカウントを作成した場合には、30日間つかえる¥22,500のクーポンをいただけるようで十分まかなえています

![スクリーンショット 2020-11-23 11.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/bd51a05f-2e1c-6e2f-26da-b539d7415aab.png)


# [Elixir](https://elixir-lang.org/)
- ここで突然ですが、私は[Elixir](https://elixir-lang.org/)という言語が好きです
    - [I Was born to love Elixir](https://twitter.com/torifukukaiou/status/1274020337223516160)
- [Umbrella project](https://elixirschool.com/en/lessons/advanced/umbrella-projects/)というものがあるのですが、マイクロサービスの考え方に似ているところがあるようにおもいました
- [Programming Phoenix >= 1.4](https://www.amazon.co.jp/dp/1680502263)[^1]という本の中では次のような説明があります

> We'll extract the web-centered and backend pieces of our application into their own projects called child applications. When we're done, **we'll be able to test, develop and deploy each child app independently**.
> ...
> In Elixir, that notion is called the umbrella project. Each application under an umbrella is called a child application.

- 私の感じ方は全然的外れなのかもしれませんが、とにかく**[Elixir](https://elixir-lang.org/)という言語は素敵な言語**です:rocket::rocket::rocket:
- この記事を書くことでなんとなくつかめてきた感があるので勢いそのままに、[Azure](https://azure.microsoft.com/ja-jp/)とからめて下記の記事を書きました
    - [Phoenixで実装した湯婆婆をAzureで動かす。Azure Virtual Machinesを使うとEC2やVPSでやったことがあることとなんらの変わり無しになりそうで、せっかくDockerと仲良くなりはじめたのでAzureコンテナーで動かしてみる。もちろんHTTPS緑にしたいのでアプリケーションゲートウェイも使ってみる。](https://qiita.com/torifukukaiou/items/c468a228f9d0ba13ffb9)

[^1]: [Phoenix](https://www.phoenixframework.org/)とは、[Elixir](https://elixir-lang.org/)を使ってWebアプリケーションを作っていくフレームワークです

## アドベントカレンダー :santa: :santa_tone1: :santa_tone2: :santa_tone3: :santa_tone4: :santa_tone5:
- ということで、[Elixir](https://elixir-lang.org/)が気になったというかたはぜひアドベントカレンダーをご覧になってください
    - [Elixir Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)
    - [Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2)
    - [fukuoka.ex Elixir／Phoenix Advent Calendar 2020](https://qiita.com/advent-calendar/2020/fukuokaex)
    - [#NervesJP Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nervesjp)
- まだ空いている日もありますのでぜひご参加ください！


**2日目は @changeworld さんの「[Docker 化する際に大事なこと！](https://qiita.com/changeworld/items/ce9316656118a2079c04)」です。引き続きお楽しみください。**