Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
第6回 AWSとGitHub勉強会 - AWS ECS Fargate環境の構築 -
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
荻原利雄
September 18, 2023
Programming
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
第6回 AWSとGitHub勉強会 - AWS ECS Fargate環境の構築 -
荻原利雄
September 18, 2023
More Decks by 荻原利雄
See All by 荻原利雄
先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~
ogiwarat
0
270
実践ArchUnit ~実例による検証パターンの紹介~
ogiwarat
2
1.6k
Spring Frameworkの新標準!? ~ RestClientとHTTPインターフェース入門 ~
ogiwarat
4
3k
Spring Boot vs MicroProfile ~クラウドネイティブにおけるフレームワークの比較と選択~
ogiwarat
2
2.7k
第1回 AWSとGitHub勉強会 - キックオフ -
ogiwarat
0
1.2k
第2回 AWSとGitHub勉強会 - CodespacesとHelidonの利用 -
ogiwarat
0
1.2k
第3回 AWSとGitHub勉強会 - GitHub Actionsを使ったCI環境の構築 -
ogiwarat
0
1.2k
第4回 AWSとGitHub勉強会 - GitHub Actionsを使ったCD環境の構築 -
ogiwarat
0
1.2k
第5回 AWSとGitHub勉強会 - AWS EC2環境の構築 -
ogiwarat
0
1.1k
Other Decks in Programming
See All in Programming
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
660
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
140
業務時間外もAIに働いてもらう話
colorful12
3
10k
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
55
37k
What We Talk About When We Talk About XP
m_seki
2
470
自分的「カンファレンスの楽しみ方」
syumai
0
200
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
150
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
270
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
590
Building an army of robots
kneath
306
46k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
730
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Code Review Best Practice
trishagee
74
20k
Leo the Paperboy
mayatellez
9
2.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Transcript
AWSとGitHubを使ってみよう勉強会 ~ 第6回 AWS ECS Fargate環境の構築 ~ 株式会社 豆蔵 ビジネスソリューション事業部
updated:2023/9/18
本日の内容 • 前回の課題の解説(60分) ※「前回の課題の回答」は解説の中で一緒に説明します 2 画面キャプチャやコマンド操作等はGitHubのssi- mz-studygroupユーザで行った例となります。キャ プチャやコマンド等の該当部分は自分のユーザIDに 読み替えてください ・ssi:simple
server infra ・mz:mamezou
3 前回の課題の解説 ・サンプルアプリの設定による動作変更 ・課題の全体像とECS Fargateとは
Step1. REST APIで返す値を環境変数で指定できるようにサンプル アプリを修正する • 変更内容 • 環境変数CONFIG_VALの設定が • ある場合は、その設定値をREST
APIで返す • ない場合は、デフォルト値として“Hello" • 変更方法 • MicroProfile Configを使って設定ファイルの設定値を環境変数で上書きできるようにする • MicroProfile Configについては以下を参照 • https://developer.mamezou-tech.com/msa/mp/cntrn06-mp-config/ • ご自身でやってもらう方がいいと思いいますがMicroProfileは目的外なので、ひな形リポジトリに回答例 をアップしています • src/main/java/sample/HelloResource.java(変更) • src/main/resources/META-INF/microprofile-config.properties(追加) • src/test/java/sample/HelloResourceTest(変更) 4 再掲
対応後のサンプルアプリ 5 import org.eclipse.microprofile.config.inject.ConfigProperty; … @ApplicationScoped @Path("hello") public class HelloResource
{ @Inject @ConfigProperty(name = "config.val") private String configValue; @Produces(MediaType.TEXT_PLAIN) public String hello() { return configValue; } } config.val=Hello ・/META-INF/microprofile-config.properties ・環境変数 CONFIG_VAL=Chanaged override injection • 同じキーが設定されている場合、優先度が高い設 定源が優先される • 環境変数は英字は小文字、記号は.(ドット)に置 換した変数としても評価される MicroProfile Configの機能を利用 設定源 優先度 システムプロパティ 400 環境変数 300 /META-INF/microprofile-config.properties 100 config_ordinalが設定されている設定源 config_ordinalの値 ※config_ordinalは任意の設定源に設定可能
サンプルアプリの設定の上書き実行 6 # 最新のコンテナイメージの取得 sudo docker pull ghcr.io/[自分のGitHubユーザ名]/hello-app:latest # コンテナの起動
sudo docker run -d --rm --name hello-app -p 7001:7001 ghcr.io/[自分のGitHubユーザ名]/hello-app:latest # 起動ログの確認 sudo docker logs hello-app # レスポンスの確認 curl localhost:7001/api/hello > Helllo # コンテナの起動 sudo docker run -d --rm --name hello-app -p 7001:7001 -e CONFIG_VAL=Changed ghcr.io/[自分のGitHubユーザ名]/hello- app:latest # 起動ログの確認 sudo docker logs hello-app # レスポンスの確認 curl localhost:7001/api/hello > Changed ※GitHub Actionsでサンプルアプリをコンテナイメージにビルドしてコンテナレジストリにpushした後の操作 ▪ デフォルト設定でのコンテナ起動 ▪ 設定を変更してコンテナ起動
latestタグのpullは意味あるの? 7 # 最新のコンテナイメージの取得 sudo docker pull ghcr.io/[自分のGitHubユーザ名]/hello-app:latest # コンテナの起動
sudo docker run -d --rm --name hello-app -p 7001:7001 ghcr.io/[自分のGitHubユーザ名]/hello-app:latest # 起動ログの確認 sudo docker logs hello-app # レスポンスの確認 curl localhost:7001/api/hello > Helllo # コンテナの起動 sudo docker run -d --rm --name hello-app -p 7001:7001 -e CONFIG_VAL=Changed ghcr.io/[自分のGitHubユーザ名]/hello- app:latest # 起動ログの確認 sudo docker logs hello-app # レスポンスの確認 curl localhost:7001/api/hello > Changed ▪ デフォルト設定でのコンテナ起動 ▪ 設定を変更してコンテナ起動 docker runで一緒にpull してくれるのにわざわざpullす る必要あるの? こっちではなんでdocker pullしてないの?
latestタグが更新されない理由 8 さっきの答えは ➢ docker pullはリモートリポジトリを常に見に行くがdocker runはローカルリポジトリに該当イメージがないときだけしか リモートリポジトリは見に行かない ➢ よってdocker
runでローカルリポジトリにlatestのイメージがある場合、latestが更新されない latestタグを使うとより深刻な問題が 起きる可能性があります。それはなんで しょうか?
latestタグの問題(あまり使っちゃダメ) 9 latestタグの対象は移動する。なので ➢ 断面が不定になる • kubernetesやECSなどのコンテナオーケストレーションが持つ指定した断面に環境を戻すrollbackができなくな る ➢ 異なるバージョンが混じる
➢ コンテナオーケストレーションでオートスケールやオートヒーリングされたときのlatestは既にデプロイされているコンテ ナイメージと異なっている可能性がある ➢ これによりクラスタを構成するコンテナインスタンスごとに挙動が変わってしまう恐れがある サンプルではコンテナイメージをピンポイントで指定できるようにタイムスタンプのタグをつけている dockerイメージをリポジトリ管理する際のタグ戦略は非常に重要となる (他のタグ戦略としては通番を振ったりコミットハッシュを使ったりするのが典型)
典型的なJakartaEEフルスタックなWebアプリ JSF(+CDI) CDI JPA(+CDI) コンテナで環境変数の利用は定石- MicroProfile Config 登場背景 • JakartaEEには設定ファイルに対する共通的な仕様が定義されてい
ない • web.xmlやbeans.xml, persistence.xmlなど仕様ごとに必要 な設定ファイルが存在する(徐々にアノテーションでも定義できるよう になってはきてはいる) • アプリケーション全体レベルでの設定の見通しが悪く、設定漏れや配 置漏れも起きやすくハッキリいって不便(Springの application.ymlが裏山) 10 Configに対する2つのモチベーション 多すぎる設定ファイル CloudNativeへの追従 • マイクロサービスアーキテクチャのbest practiceとして知られるThe Twelve-Factor Appの“Ⅲ 設定”では「設定を環境変数に格納 する」ことを推奨している • これまでJakartaEEの仕様でこれを実現できるものはなかった (SpringBootでは普通にできるけど) web.xml persistence.xml beans.xml orm.xml presentation faces-config.xml business beans.xml integration beans.xml 多すぎ、散らばりすぎ、勘弁して・・ 引用:Twelve-Factor Appを噛み砕いてみた - Qiita @supreme0110 ✓ 設定はコードや設定ファイルに含めず、環境変数で設定するようにし ましょう。 ✓ なぜならコードに含めてしまうと環境ごとにビルドが必要になり、設定 ファイルの場合は環境ごとにファイルが必要となりスケールしにくくなる ためです。 ✓ 環境変数であればOSが異なっても取得方法は基本的に統一でき ます -Ⅲ 設定-
11 前回の課題の解説 ・サンプルアプリの設定による動作変更 ・課題の全体像とECS Fargateとは
これでまでの課題でやってきた全体像 – 振り返り ✓ コンテナの実行環境がEC2からECSに替わっただけ ✓ だがしかし、EC2で行っていたDocker環境の構築やコンテナの起動停止の運用周りは一切不要に 全体として変わっ たのはここだけ ECSが勝手
に取ってきてく れる
ECS Fargateとは 13 Amazon Elastic Container Service (Amazon ECS) は、コンテナ化されたアプリケーションのデプロイ、
管理、スケーリングを容易にするフルマネージドコンテナ オーケストレーションサービスです。※AWS公式の完全 引用 <ECSとは> コントロールプレーン: 必要なリソースを決定し、必要な場所 で実行・管理する基盤 データプレーン: リソースを指示されたとおりに実行す る基盤 AWS Fargate はAmazon ECSで使用できるテクノロジーであり、サーバーやAmazon EC2インスタンスのクラスターを管理することなくコンテナを実行できます。Fargate を使用 すると、コンテナを実行するために仮想マシンのクラスターをプロビジョニング、設定、スケール する必要はありません。 これにより、サーバータイプの選択、クラスターをスケールするタイミングの決定、クラスターの パッキングの最適化を行う必要がなくなります。 ※AWS公式の完全引用 ⇒要はECSのデータプレーンに使えるサーバレス環境。EKSでも利用可 <Fargateとは> データプレーンにEC2を使った パターン
クラスター/サービス/タスク 14 ▪クラスター • ECSリソースを管理するための論理グループ (なだけ) ▪サービス • ECS(コントロールプレーン)の実体 •
タスクを監視しサービスで定義された状態を維 持するようにタスクのローリングアップデートや オートスケール、オートヒーリングなど行う ▪タスク定義 • なにを(コンテナイメージ)どのように(割り 当てマシンリースや環境変数など)動作させ るかを定義したもの • 定義は世代ごとに管理される ▪タスク • タスク定義をもとにサービスにより実体化され たもの(サービスにより割り当てられた実行環 境でコンテナが実行されている)
15 実際にやってみる
クラウド環境ではログの出力先は標準出力が基本 16 ✓ファイル出力ではなく標準出力に出力させ、ツールで1箇所に集約するようにしましょう。 ✓なぜならスケールイン時に仮想サーバごと消える可能性があることと、環境(OS、IDE、ロー カル/本番)が異なっても標準出力は常に行えるためです。 -Ⅺ.ログ- ⇒そもそもサーバーレスでは基本的にローカルディスクは使えない 引用:Twelve-Factor Appを噛み砕いてみた -
Qiita @supreme0110
17 おしまい。お疲れまでした