byClassmethod検索AWSAlexaモバイルビッグデータサーバーレスTableauAlteryxイベントDockerとECSで初めてマイクロサービス化(するチュートリアルを)してみたDockerECS2019年03月25日かずえ(25)55こんにちは。大阪オフィスのかずえです。マイクロサービス/Docker/ECSの取っ掛かりとして、モノリシックアプリケーションをマイクロサービスに分割するというチュートリアルをやってみました。2019年現在のECSコンソールの画面構成が変わっていて戸惑ったり、単純に知識不足でハマった箇所があったので、そういった箇所をレポートします。今後このチュートリアルをやってみる方の一助になれば幸いです。そもそもなぜ今マイクロサービスとかDockerとかが注目されてるのマイクロサービスとはアプリケーションの各コンポーネントがそれぞれサービスとして独立しており、各サービス間はAPIを介してやりとりするような形態のアーキテクチャの事を指します。対立する概念としてモノリシックアーキテクチャがあります。モノリシック=一枚岩という意味で、マイクロサービスとは逆に各コンポーネント間の独立性が保たれていないアーキテクチャのことを指します。近年のアプリケーション開発の現場では、リリースしてその後の改修は無し、ということはほとんどありません。リリース後も継続的にPDCAサイクルを回し改良を求められるケースが増えています。モノリシックアーキテクチャはこのような継続的な改良に不向きです。コンポーネント間の独立性が保たれていないため改修の影響範囲が最大でアプリケーション全体になり、「こんなところにも影響があった」「全然関係なさそうな機能でエラーが発生した」「そもそもどこに影響あるか特定するのが大変」ということが起こりやすいからです。大規模なアプリケーション、長年改修を続けてきたアプリケーションほどそういったことが起きやすいと言えるでしょう。マイクロサービスアーキテクチャではコンポーネント間がAPIを境目に独立しているので、APIの振る舞いさえ変えなければ内部のコンポーネントの改修の影響範囲はそのコンポーネント内に抑えることができます。なんならプログラミング言語ごとごっそり変えちゃう、みたいなこともできます。そのため前述のモノリシックで起きがちな問題を抑えることができ、PDCAのサイクルを高速に回すことが可能になります。このように近年のアプリケーション開発現場の要件にマッチしているため、マイクロサービスは注目されているのです。いちエンジニアから見れば、いわゆる技術的負債の増加をできる限り抑えてハッピーになる手段、とも言えるでしょう。芋づる式に増える影響範囲、バグの対応に追われて小さな機能改修にも大きな工数を割かれて「なにやってんだろ俺」と疲弊するといった経験、ありませんか。私はあります(たくさん)。いう場面を減らしどんどん新機能をリリースしてビジネスサイドに喜んでもらおう、みたいなことが実現できるのではないでしょうか。Dockerとはすごく端的に説明すると、マイクロサービスを実現するのに適している仮想化技術、です。他の仮想化技術に比べて軽量に動作します。コンテナと呼ばれる仮想環境単位で各マイクロサービスをホストし、APIで連携しあいます。Serviceの略です。すごく端的に説明すると、Dockerコンテナを管理するためのawsのサービス、です。マイクロサービスごとにコンテナをドコドコ作っていると管理が大変になります。需要に応じて特定のコンテナをスケールアウト(イン)させたい、可用性を維持したい、というようなニーズも出てくると思います。いった手間を軽減してくれるサービスです。前置きはこのくらいにして。チュートリアルやってみた際に私が詰まった箇所をレポートしていきます。補足このチュートリアルには動画もあります。わからなくなったらこちらを確認するのも良いかと思います。Dockerfileコマンドの文法エラーです。引数が足りていません。重要であることに注意してください。passwordビルドするイメージの元となるイメージをmhart/alpine-nodeから取得するところで、認証失敗エラーになっています。Macでログアウトするとエラー解消しました。プッシュするところでエラーになる以下のようなメッセージが表示されます。(アカウントID).dkr.ecr.(リージョン).amazonaws.com/api:latestエラーメッセージの通り、前段の「イメージにタグを付ける」で(v1というタグを付けましたが、)latestというタグを付けていないため発生しています。Definition]の後はタスク定義名を入れるフォームが出てくることになっています。実際やってみると「起動タイプの互換性の選択」が出てきます。ここはEC2を選択でOKです。※この設定項目の意味について知りたい方は、こちらをどうぞ。サービスとしてモノリスをデプロイする」です。(オプション)」ですが、こちらはチュートリアルには記載がありません。ここはデフォルトのまま「サービスの必要数を直接調整しない」でOKです。サービスとしてモノリスをデプロイする」です。(オプション)のチェックボックスのチェックを外してください。モノリスをテストする」です。チュートリアルに記載されているどのURLにアクセスしても503エラーになる場合、タスクがうまく立ち上がっていない可能性があります。ECSコンソールのクラスターページ「タスク」タブに移動し、状況を確認してみてください。Runningステータスのタスクが0件で、Stoppedのステータスのタスクに沢山タスクが表示されていないでしょうか?Stoppedのどれかのタスクのidをクリックして詳細画面に遷移し、原因を確認しましょう。画面下部コンテナ欄の状況がSTOPPEDとなっており、詳細欄に以下のようなメッセージが記載されていないでしょうか。found「ステップ3:タスク定義を記述する」で作成したタスク定義の中のコンテナのイメージのタグが間違っている可能性があります。「〜api:v1」を指定していませんか?こちらはモジュール1でpushしたECRリポジトリイメージのURLである必要がありますので、モジュール1でlatestタグをpushしていた場合はそちらを指定する必要があります。タスク定義は一度作成すると変更できません。「新しいリビジョンの作成」から新リビジョンを作成してください。そのバージョンを指定するように注意して再度サービスの作成フォームを進んでみてください。モノリスをテストする」です。Foundで大丈夫です!エンドポイントのNode.JSのプログラムを眺めていただければお分かりになるかと思いますが、postsに関してはusersやthreadsとは異なりドリルダウンしたエンドポイントしかありません。「/api/posts/in-thread/1」や「/api/posts/by-user/2」などで結果が返って来ればOKです。3:各サービスのイメージをビルドしタグを付ける」です。モジュール1と同じく、チュートリアルではタグ値がv1となっていますが、latestを付けるようにしておきましょう。モジュール4でlatestタグを使っているためです。設定箇所がわからないコンソールで設定する場合、記載されている項目をどこに設定するのか戸惑うかもしれません。要はモジュール2と同じように設定すれば良いです。クリーンアップ特に詰まった部分はありませんでした。256,981かずえは苗字です。