Slide 1

Slide 1 text

© 2023 e-dash Co., Ltd. Amazon ECSで複数環境の dockerイメージを頑張って共通化した話 e-dash株式会社 佐藤幸平(こへこへ)

Slide 2

Slide 2 text

© 2023 e-dash Co., Ltd. 2 ⾃⼰紹介‧所属会社に関して ⽒名:佐藤幸平(こへこへ) 所属:e-dash株式会社 役割:ソフトウェアエンジニア 出⾝:埼⽟県(2年前に名古屋に引越しました) ● 企業のCO2排出量可視化‧削減のSaaSを開発 ● 三井物産出資のスタートアップ ● 2022年設⽴‧本社は東京の⼤⼿町 ● ソフトウェアエンジニア絶賛募集中です (特にAWS詳しい⽅、、、、) お客様の脱炭素への 取り組みを⽀援して いるよ!

Slide 3

Slide 3 text

© 2023 e-dash Co., Ltd. 3 こちらのプレゼンに関して 1. 弊社ではAmazon ECSというコンテナオーケストレーションのサービスを使っ たWebアプリケーション開発を⾏っています。 2. ECSを使った複数開発環境構築の際に⼯夫した点を話します。

Slide 4

Slide 4 text

© 2023 e-dash Co., Ltd. 4 アーキテクチャ ALB RDS(Aurora) Backend Service Golang Frontend Service Next.js ECS Cluster ECR DNS resolution Cloud Map (service connect) build & push docker image update service (Rolling Update) User triggered by the merge event feature/xxx -> main System Manager Parameter Store environment variables

Slide 5

Slide 5 text

© 2023 e-dash Co., Ltd. 5 replication ⼯夫した点:環境間でのコンテナイメージの共通化 ● 複数環境間(開発環境‧検証環境‧本番環境)で同⼀のDockerイメージを使うよう にした(環境毎にAWSのアカウント⽤意) ● 環境間で異なるパラメータを利⽤したい場合は、コンテナ起動時に環境変数を設定 するようにした。 ● ビルドしたイメージはすべて開発環境のECRにPushし、別環境のECRにReplication するようにした。 ECR(stg) ECR(prod) push image ECR(dev) 202311201459,latest 202311201132 202311191824 202311201459,latest 202311201132 202311191824 202311201459,latest 202311201132 202311191824

Slide 6

Slide 6 text

© 2023 e-dash Co., Ltd. 6 replication ⼯夫した点:環境間でのコンテナイメージの共通化 ● Pushする際にビルド⽇時とlatestをタグに指定。 ● ⼿動実⾏可能なGithubActionsのワークフローを⽤意し、stg, prodのECRのイメージタグを変更 →タグの付替えだけなのでデプロイ時間が短い&ロールバックしやすい ● ECSのタスク定義でPullするタグを以下の通りに設定 開発環境(latest) / 検証環境(latest-stg) / 本番環境(latest-prod) ECR(stg) ECR(prod) push image ECR(dev) 202311201459,latest 202311201132 202311191824 202311201459,latest 202311201132 202311191824,latest-stg 202311201459,latest 202311201132,latest-prod 202311191824 deploy

Slide 7

Slide 7 text

© 2023 e-dash Co., Ltd. 7 苦労した点:Next.jsのコンテナイメージのビルド ● Next.jsは、クライアントサイドで使⽤可能な環境変数(※)と、サーバーサイド(API Route)で 使⽤可能な環境変数に分かれている。 ● 前者はDockerイメージのビルド時(yarn build)にしか指定することができない。 ● フロントエンド側で必要な変数(e.g. ページのURLとか)に関しては、クライアント側では環境 変数に指定せず、Next.jsにAPIを⽤意し、サーバーサイドから取得するようにした。 ECS(dev) Frontend Task Next.js frontend_logout_url = https://dev.e-dash.com/logout call Next.js api to get Logout URL (※)Next.jsではビルド時にNEXT_PUBLIC_プレフィッ クスの値をクライアントサイド(ブラウザ)で利⽤可 能な変数として注⼊できる。

Slide 8

Slide 8 text

© 2023 e-dash Co., Ltd. 8 まとめ 1. dockerイメージを複数環境で使い回すメリット a. 環境ごとにdockerをビルドしなくてよい b. デプロイ‧ロールバック時間の短縮 2. dockerイメージを複数環境で使い回すデメリット a. フロントエンド(React/Vue)側の環境変数を設定できない b. 環境毎にgitのbranchを切っている場合採⽤しずらい

Slide 9

Slide 9 text

© 2023 e-dash Co., Ltd. Thank you for listening