AWS Startup ブログ

【週刊 Ask An Expert #17】AWS で Docker を使うときの選択肢は?先週の #AWSLoft で受けた質問10選

こんにちは、スタートアップ ソリューションアーキテクトの塚田 (Twitter: @akitsukada) です。好きな Chalice の機能は Built-in Authorizer です。

まず最初に、今回の週刊 Ask An Expert では Docker コンテナに関する質問が多く、皆さんの関心が伺える週となりました。そんなみなさんにイチオシのイベント情報は AWS Containers talk with Mercari です!↓

メルカリ、メルペイにおける AWS Fargate や Amazon EKS の事例解説イベントです

メルカリさんにおける AWS のコンテナサービス活用事例が気になる方は、ぜひ ↑ から申し込んでください!

さて、ではここから週刊 Ask An Expert 第 17 回目をお届けします。「参考になったわ!」「ええ内容や!」と思っていただけたら、ぜひハッシュタグ #AWSLoft を付けてシェアしてください。もちろん、改善点・ご要望もお待ちしております。

Ask An Expert ?

皆さん AWS Loft Tokyo はご存知でしょうか?

目黒セントラルスクエア17Fにある、AWS を利用中のスタートアップとデベロッパーのためのコワーキングおよびイベントスペースです。その一角に AWS のエキスパート – Solutions Architect (SA) や Cloud Support Engineer (CSE) – といった中の人に技術的な質問ができる、Ask An Expert カウンターがあります。そこでは毎月、来場者の方から100件以上にものぼるご相談をお受けしています。

ある日の Ask An Expert – ホワイトボードで解説する SA 浅野(写真左)

この連載「週刊 Ask An Expert」では、多くのご相談を中から我々スタートアップソリューションアーキテクトが 独断で面白かった質問を 10 個選び、ざっくりとご紹介していきます。他の AWS Loft 利用者がどんな質問をしているのか、自分が知らなかった新しいトピックはないか、Ask An Expert ってどんなところなのか、一緒に見ていきましょう!

週刊 Ask An Expert #17 (2019/08/05 – 08/09)

この週の対応者は SA: 浅野・荒木・桶谷・松田・水馬と CSE: 古野 でした。

Q1: PHP のアプリケーションを開発・運用している。Amazon EC2 上で動いているアプリケーションをコンテナ化するメリットとは?

Docker 化のメリットについて、以下の資料をベースにご説明させて頂きました。

20190521 これから始めるコンテナワークロード – コンテナ化ベストプラクティス –

  • 上記資料 8 ページより
    • RunAnywhere(複数環境に渡る一貫した実行可能性)
    • Portability(可搬性の高さ,コンテナイメージの作成、レジストリ、アップロード、ダウンロードなどのエコシステム)
    • Isolated process(コンテナのプロセスレベルのアイソレーション、それによるCPUやメモリに代表されるリソースの柔軟な割り当て、高速な起動と停止)

運用という観点でいうと、例えば AWS Fargate であれば Amazon EC2 の管理は不要であるという点などもお伝えしました。

また、最近執筆された次の記事も参考になるかと思います。ぜひご覧ください。

Q2: AWS で Docker を使う場合、どんな選択肢がある?

以下の記事をご紹介しながら Amazon ECSAmazon EKSAWS Fargate について説明しつつ、まずは AWS Fargate が使えそうか確認してみてはどうか、とご案内しました。

Q3: Amazon ECS において、クラスタはどう分けるのがよいか?

まず、起動タイプが EC2 なのか Fargate なのかで考慮する範囲が違ってきます。EC2 起動タイプであれば、クラスタを分けた場合 EC2 インスタンス自体が別になるので、例えばクラスタが持つ CPU やメモリなどのリソース量はクラスタごとに起動しているインスタンスタイプ・数によります。 対して Fargate であればクラスタは論理的な空間であり、EC2 インスタンスという概念自体が存在しません。

他にもいくつかの観点がありますが、例えば以下のような権限管理の面を考えてみます。

ECS が提供する API である CreateService, UpdateService, DeleteService, RunTask, StartTask API などは、AWS IAM のポリシー内の Condition keys で操作可能なクラスタを指定できるので、クラスタを分けることで例えば「IAM ユーザー A / IAM ロール A は Staging 環境のクラスタでサービスやタスクを作成・更新できるが、本番環境のクラスタではできない」といった詳細な権限制御を行うことができるので、そういった面で検討してみるのはいかがでしょうか。

Q4: Amazon ECS の一つのクラスター上に、 異なる起動タイプ(EC2 と Fargate)のサービスやタスクを混在させることは可能か?

可能です。EC2 Launch Type の場合、対象クラスターに EC2 を参加させ、タスク・サービス作成時に EC2 起動タイプを指定ください。

Q5: Amazon ECS で Service を更新するにはどのような方法がある?

2019年8月現在、1. BlueGreen Deployment (CodeDeploy を利用) 2. RollingUpdate (UpdateService API を利用) の2種類が選べます。

  1. Blue/Green Deployment では、テストリスナーを設定することでデプロイ前に事前にテストなども可能です。デプロイ時、一時的に倍のリソースが必要となります。
    • 例:希望タスク数が 2 の場合、デプロイ時に追加で 2 タスク起動させ、一時的に合計 4 タスクのリソースが必要
  2. RollingUpdate の場合、事前のテストは出来ませんが、アップデート中の最大ヘルス率/最小ヘルス率 を指定してどの程度追加リソースが必要か・デプロイをどのようにするかなどを設定可能となります。
    • 例1:希望タスク数が 2 で、最大ヘルス率 200% / 最小ヘルス率 100% を指定してサービスを更新した場合、新規タスクを 2 起動して合計 4 タスク(=200%)が起動している状態になった後に古いタスク 2 を終了し、全てのタスクが新バージョンで起動している状態となる。
    • 例2:希望タスク数が 2 で、最大ヘルス率 100% / 最小ヘルス率 50% を指定してサービスを更新した場合、まず古いタスクを 1 つ終了(=50%になる)してから新規タスクを 1 つ起動する(=100% に戻る)。まだ 1 つ古いタスクが残っているので、もう一度古いタスクの終了と新規タスクの起動を繰り返し、全てのタスクが新バージョンで起動している状態となる。

詳しくは、サービスの更新に関するドキュメントをご覧ください。

Q6: Amazon ECS の Blue/Green デプロイメントにおいて、テストリスナーによる動作確認の有無を切り替えたい場合どうすればよいか?

デプロイメントグループの設定で「トラフィックの再ルーティング」という項目があり、「すぐにトラフィックを再ルーティング」にすれば、確認作業を待つことなくすぐにトラフィックを新規タスクにルーティングさせることができます。

Q7: 手元の環境では docker-compose で動いている Docker コンテナを ECS 上で動かそうとすると、動かない。

Amazon CloudWatch Logs を見ると npm run がエラーを吐いていることが分かったため、改めて ECR 上のコンテナが正常に起動できるものなのか確認をお願いしました。

Q8: 現在、Client->ALB->Amazon EC2->Amazon S3 の構成で PDF ファイルのアップロード機能を実装している。今後より大きなファイルのアップロードを検討しているが、より効率的な方法はないか?

ヒアリングさせて頂いた所、現時点でファイルの事前チェック(≒サーバーサイドでのアップロード関連ロジックの作り込み)などは不要とのことだったので、署名付き URL を使用したオブジェクトのアップロード方法をご案内しました。(EC2 で署名付き URL を発行して、クライアントから直接 S3 へアップロード)

また、将来的にアップロードするファイルの事前チェック等が必要となった場合は、S3 への Put を契機に AWS Lambda などを起動し、非同期でチェックする方法はどうか、とディスカッションもさせて頂きました。

Q9: Amazon EC2 上で Java アプリケーションが起動しない。何が問題か、アドバイスをしてくれないか。

起動時のログを確認したところ、JVM のメモリ確保に失敗している点が原因の様でした。現在の起動スクリプトでは JVM 起動時にメモリサイズが指定されていなかったので、-Xms -Xmxオプションでメモリサイズを指定できることをご案内しました。

Q10: 初めてAWSを触っているのだが、どこから学習していけば良いか分からない。勉強方法でアドバイスが欲しい。

ご相談頂いた方のバックグラウンドをお伺いしたところ、エンジニア経験自体があまり無い様でしたので、まずは現在のシステム構成で利用している Amazon EC2、Amazon RDS を中心に学習して、担当の環境をしっかり管理できる様にすることをアドバイスさせて頂きました。

具体的な方法として、EC2 や RDS については、AWS BlackBelt オンラインセミナーの資料や動画をベースに概念を整理し、利用する機能の詳細については公式ドキュメントで確認するやり方をご案内しました。あわせて、基本的分野として一般的なネットワーク関連の知識を整理する事で、VPC 等の関連機能の把握がしやすくなるのではとお話しました。

週刊 Ask An Expert まとめ、今回はここまで

最後までお読み頂きありがとうございます。

冒頭に書いたように、執筆者の独断により興味深かった質問 10 個を選び、且つざっくりとまとめて記載しているため、実際にはより具体的な質問をより多く頂いていますが、様々なご相談があることが伝わっていれば嬉しいです。まだ Ask An Expert カウンターをご利用になったことがない方も、AWS Loft Tokyo をご利用の際はぜひお気軽にご質問くださいね。

※Ask An Expert が混雑してお待ちいただく場合、またはエキスパートが不在の場合がございます。何卒ご容赦ください。

それではまた次回をお楽しみに!

このブログの著者

塚田 朗弘(Akihiro Tsukada)
スタートアップソリューションアーキテクト。好きなサービスは AWS AmplifyAWS AppSyncAmazon PinpointChalice。趣味は頭を触ってくる子供と遊ぶこと。