Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Amazon ECS とマネージドサービスを活用したフルコンテナ構成によるゲームサーバの構築と...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
FUJIWARA Shunichiro
August 22, 2018
Technology
5.8k
24
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Amazon ECS とマネージドサービスを活用したフルコンテナ構成によるゲームサーバの構築と運用 / Amazon-ECS-game-server
CEDEC 2018 の講演資料です
https://2018.cedec.cesa.or.jp/session/detail/s5abc66488c745
FUJIWARA Shunichiro
August 22, 2018
More Decks by FUJIWARA Shunichiro
See All by FUJIWARA Shunichiro
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
7
1.5k
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
9
5.2k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
2
360
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
13k
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
9
6.8k
alecthomas/kong はいいぞ
fujiwara3
7
2.5k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
3.7k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
4
4.8k
監視のこれまでとこれから/sakura monitoring seminar 2025
fujiwara3
12
5.9k
Other Decks in Technology
See All in Technology
Playwright × AI Agent でE2Eテストはどう変わるか AI駆動テストの可能性と実用検証の結果
taiga7543
2
890
iOS/Androidの二刀流エンジニアがFlutter & TypeScriptへ越境後の現在地 - Flutterがメインになって見えた景色と現在の醍醐味 / Dual-Platform Mobile Engineer Shifts to Flutter & TypeScript - The View and Real Thrill of Going Flutter-First
bitkey
PRO
0
100
論語・武士道・産業革命から見る かわるもの、かわらないもの
ichimichi
8
1.2k
AIエージェントがあれば技術書なんてすぐ書けるでしょ→無理でした
watany
6
530
データエンジニアこそ組織のオントロジーに向き合うべき — 問いに答えるAIから、事業を動かすAIへ
gappy50
2
490
現場で使える AWS DevOps Agent 活用ノウハウ - Release Management 機能の検証結果を添えて / AWS DevOps Agent Release Management and Know-How
kinunori
3
130
プロダクト開発組織の現在地(Ver.2026/07) / product-organization
kaonavi
0
530
Webアプリ認証の全体像 / The Big Picture of Web App Authentication
kitano_yuichi
1
450
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
540
エンタープライズデータへ安全につなぐ Production-ready なエージェント設計 ― AI × MCP リファレンスアーキテクチャ ― #AIDevDay
cdataj
1
120
Git 研修【MIXI 26新卒技術研修】#2
mixi_engineers
PRO
1
270
コンテナ・K8s研修【MIXI 26新卒技術研修】#2
mixi_engineers
PRO
1
210
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
410
New Earth Scene 8
popppiees
3
2.4k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
570
A Tale of Four Properties
chriscoyier
163
24k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
390
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
Deep Space Network (abreviated)
tonyrice
0
230
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Transcript
Amazon ECS ͱ ϚωʔδυαʔϏεΛ׆༻ͨ͠ ϑϧίϯςφߏʹΑΔ ήʔϜαʔόͷߏஙͱӡ༻ 2018.08.22 CEDEC 2018 ໘ന๏ਓΧϠοΫ
౻ݪढ़Ұ
ࣗݾհ @fujiwara github.com/fujiwara sfujiwara.hatenablog.com
Game & Community
Agenda • Amazon ECS Ͱͷαʔόߏஙͱӡ༻ • σϓϩΠख๏ͱൿಗใͷཧ • ϩάͷूͱετϦʔϛϯάॲཧ •
GoݴޠʹΑΔӡ༻πʔϧ/ϛυϧΣΞ։ൃ
࠷ॳʹ͓ͼ ·ͨɺຊ൪ϦϦʔεલʹඞਢͰ͋ΔෛՙࢼݧίϯςφΛ׆༻͢Δ͜ ͱͰॊೈʹߦ͑ΔͨΊɺͦͷख๏ʹ͍ͭͯઆ໌͠·͢ɻ0 ෛՙࢼݧʹ͍ͭͯऩ·Γ͖Βͳ͔ͬͨͨΊ ผͷࢿྉΛ͝ࢀর͍ͩ͘͞ ! GoͱίϯςφͰ࡞ΔWebΞϓϦέʔγϣϯϕϯνϚʔΧʔ speakerdeck.com/fujiwara3/benchmarker-built-with-go-and-container 0 https://2018.cedec.cesa.or.jp/session/detail/s5abc66488c745
Amazon ECS Ͱͷαʔόߏஙͱӡ༻
Amazon ECS AWSͷίϯςφཧϚωʔδυαʔϏε ͍ΘΏΔʮΦʔέετϨʔγϣϯπʔϧʯ ෳͷίϯςφͰىಈͨ͠ϓϩηε܈Λཧ͢Δͷ ଞʹ༗໊ͳͷ Kubernetes(k8s)
ECS ͷ֓೦
λεΫ - Task ؔ࿈͢ΔίϯςφϓϩηεΛҰͭʹ·ͱ Ίͨͷ λεΫͷίϯςφ૬ޓʹ௨৴Ͱ͖Δ (localhost or hostname) k8s
ͷ Pod ʹ૬
λεΫఆٛ - Task Definition λεΫͷߏΛఆٛ͢Δͷ ؚ·ΕΔ(ෳͷ)ίϯςφɺλεΫࣗମ ͷωοτϫʔΫઃఆͳͲΛఆٛ • Πϝʔδ •
CPU • ϝϞϦ • ϙʔτׂΓͯ ͳͲ
αʔϏε - Service λεΫΛෳݸଋͶͨͷ • ϩʔυόϥϯαʔ (ALB, NLB) ʹऩ༰ ͢Δ୯ҐʹͳΔ
• ࢦఆͨ͠λεΫΛҡ࣋͢Δ • λεΫΛΦʔτεέʔϧͰ͖Δ k8s ͷ Deployment ʹ૬
Ϋϥελʔ - Cluster λεΫ͕ஔ͞ΕΔ EC2 Πϯελϯεͷू߹ EC2 Πϯελϯεࣗମ͕Ϛωʔδυʹͳͬͨ Fargate
None
ࠓ·Ͱͷ EC2 Ͱͷαʔόӡ༻ͱҧ͏ EC2 ্ʹΞϓϦέʔγϣϯ/ϛυϧΣΞΛىಈ → λεΫʹϓϩηεΛ·ͱΊΔ ϩʔυόϥϯαʔʹEC2ΠϯελϯεΛొ → αʔϏεΛొ
ΦʔτεέʔϧEC2ΠϯελϯεΛ૿ݮ͢Δ → λεΫΛ૿ݮ͢Δ …ͨͩ͠ EC2 ίϯςφΠϯελϯε૿ݮ͠ͳ͍ͱ࣮ࡍʹ͑ΔϦιʔ εมΘΒͳ͍ / Fargate Ͱղܾ
ECS Ͱͷαʔόߏͷํ ঢ়ଶΛ࣋ͨͳ͍ΞϓϦέʔγϣϯͷΈΛಈ͔͢ ࣌ؒͷঢ়ଶΛ࣋ͭϛυϧΣΞಈ͔͞ͳ͍ (RDBMSͳͲͷετϨʔδ) ঢ়ଶͯ͢ϚωʔδυαʔϏεอଘ͢Δ (RDS, S3, ElastiCache...)
ECS Ͱͷαʔόߏͷํ ঢ়ଶΛ࣋ͨͳ͍ΞϓϦέʔγϣϯͷΈΛಈ͔͢ σϓϩΠͷͨͼʹ৽͍͠λεΫ͕ىಈ͠ɺݹ͍λεΫམͪΔ λεΫ͕ऴྃ/མͪΔͱϑΝΠϧͷॻ͖ࠐΈࣦΘΕΔ EC2ϗετͷϑΝΠϧγεςϜΛϚϯτͰ͖Δ͕… ΫϥελͷͲͷEC2ͰλεΫΛىಈ͢Δ͔ECS͕ܾΊΔ → Ӭଓ͢Δঢ়ଶͯ͢ϚωʔδυαʔϏεʂ ϩάϩʔΧϧϑΝΠϧʹ࣋ͨͣϚωʔδυαʔϏεసૹ
ECS ʹͯ͠Α͔ͬͨ͜ͱ EC2্ͰͷϛυϧΣΞͷߏཧ͕ෆཁ ͜Ε·Ͱ Chef Ͱཧ ੈؒͰ͍͏΄Ͳਏ͘ͳ͍͕… ႈʹ͢Δͷ͕໘ɺΞϓϦέʔγϣϯΤϯδχΞʹෛ୲ → Dockerfile
ͰΫϦʔϯͳঢ়ଶ͔ΒΠϯετʔϧ͢Δ͚ͩ
ECS ʹͯ͠Α͔ͬͨ͜ͱ αʔόͷՃআָ͕ ΫϥελͷEC2Πϯελϯεͯ͢ಉ͡ͷ ͜Ε·Ͱαʔόͷछྨ͝ͱʹΠϯελϯεΛ࡞͍ͬͯͨ App, WebSocket, Batch, ϩάू etc...
OS ʹ࠶ىಈඞਢͳύονΛ͍ͯͨ߹ 1.৽͍͠ AMI ͔ΒΠϯελϯεىಈ 2.λεΫΛ৽͍͠ΠϯελϯεʹҠಈ 3.ݹ͍ΠϯελϯεΛࣺͯΔ
ECS ʹͯ͠େมͩͬͨ͜ͱ ͜Ε·Ͱͱͷҧ͍Λҙࣝͯ͠Γӽ͑Δ ֓೦ΛΞϓϦέʔγϣϯΤϯδχΞʹཧղͯ͠Β͏ͷ͕େม ϩʔΧϧϑΝΠϧʹґଘ͠ͳ͍ΈΛ࡞Δඞཁ͕͋Δ → ঢ়ଶΛ࣋ͨͳ͍͜ͱΛపఈ͢Δ ʲྫʳϩάΛ tail -f
͍͚ͨ͠ͲϑΝΠϧʹॻ͚ͳ͍… → ϚωʔδυαʔϏεʴࣗ࡞πʔϧͰղܾ (ޙड़)
ECS ʹͯ͠େมͩͬͨ͜ͱ ϓϩηεͷঢ়ଶΛΈΔௐ͕ࠪ໘ ʮstrace ͍ͨ͠ʂʯ ɾૂͬͨλεΫ͕ಈ࡞͍ͯ͠ΔEC2ͷϗετΛݟ͚ͭΔ ɾEC2 ʹ ssh ͯ͠
docker exec sh & strace ίϯςφʹೖͬͯඞཁͳπʔϧ͕ͳ͔ͬͨΓ͢Δ
ECS / ίϯςφԽͷ෭࡞༻ ঢ়ଶΛ࣋ͨͳ͍ɺϗετ͍ͭফ͑ͯͳ͍Α͏ʹͳͬͨ → Spot Πϯελϯε͕׆༻Ͱ͖Δ ௨ৗͷΦϯσϚϯυΠϯελϯεͷ༨ϦιʔεΛ҆͘ (30%͙Β͍Ͱ) ఏڙ͢Δͷ
ͨͩ͠༨Ϧιʔε͕ͳ͘ͳΔͱམͱ͞ΕΔ
Spot Fleet ෳͷΠϯελϯελΠϓ AZ ΛΈ߹ΘͤͯϦιʔεΛ֬อ མͪͨࣗಈతʹସ͕ىಈ
ECS Ͱ Spot ΠϯελϯεΛ҆શʹΓ͢ ΦϯσϚϯυͷधཁ͕૿͑ͯ Spot ׂΓͯΔϦιʔε͕ ͳ͘ͳΔͱ120ඵલʹ termination ௨͕དྷΔ
http://169.254.169.254/latest/meta-data/spot/instance-action Λ polling → ঢ়ଶมԽΛݕͨ͠ΒࣗࣗΛΫϥελ͔Β֎͢ ͜ΕΛ͠ͳ͍ͱλεΫ͕ಥવࢮ͢Δ
֤ΠϯελϯεͰୀॲཧλεΫΛಈ͔͢ #!/bin/bash while sleep 5; do CONTENT=$(curl -sf http://169.254.169.254/latest/meta-data/spot/instance-action) if
[ -z "$CONTENT" ]; then continue fi CLUSTER=$(curl -s http://localhost:51678/v1/metadata | jq -r .Cluster) CONTAINER_INSTANCE=$(curl -s http://localhost:51678/v1/metadata | jq -r .ContainerInstanceArn) aws ecs update-container-instances-state \ --cluster "$CLUSTER" \ --container-instances "$CONTAINER_INSTANCE" \ --status DRAINING \ && exit 0 done localhost:51678 = ECS agent ! ਖ਼͜Ε͙Β͍ ECS agent ͕ͬͯ΄͍͠
Amazon ECS Ͱͷαʔόߏஙͱӡ༻ ·ͱΊ • ΞϓϦέʔγϣϯʹঢ়ଶΛ࣋ͨͳ͍͜ͱΛపఈ͢Δ • ঢ়ଶΛ࣋ͨͳ͍͜ͱͰಘΒΕΔϝϦοτΛڗड͠Α͏
σϓϩΠख๏ͱൿಗใͷཧ
͜Ε·Ͱͷ EC2 ্ͷσϓϩΠ • ֤ EC2 ʹΞʔΧΠϒϑΝΠϧΛ • S3 ʹ
tar.gz ΛΞοϓϩʔυ • ֤ϗετ͕ S3 ͔Βμϯϩʔυ ͯ͠ల։ • ϓϩηεΛ graceful ʹ࠶ىಈ Consul + Stretcher (ࣗ࡞OSS) Ͱ࣮ݱ
ECSʹ͓͚ΔσϓϩΠ Ϣʔβ͕Δ͜ͱ ৽͍͠ΞϓϦέʔγϣϯؚ͕·ΕͨΠ ϝʔδΛ ECR ʹొ ৽͍͠ΠϝʔδΛ͏λεΫఆٛΛొ αʔϏεઃఆͰ৽͍͠λεΫఆٛΛ͏ Α͏ʹมߋ
ECSʹ͓͚ΔσϓϩΠ ECS ͕Δ͜ͱ ৽͍͠λεΫఆٛͰλεΫΛىಈ (LB ͕͋Δ߹ LB ʹΈࠐΉ) ਖ਼ৗʹىಈɺΈࠐΊͨΒݹ͍λεΫΛ Λམͱ͢
ਖ਼ৗʹىಈ͠ͳ͔ͬͨΒݹ͍ͷམͪ ͳ͍ αʔϏεͷͯ͢ͷλεΫ͕৽͍͠ ͷʹͳͬͨΒྃ
ϩʔϧόοΫ ݹ͍λεΫఆٛΛ͏Α͏ʹαʔϏεΛมߋ͢Δ ಛʹ ECS ʹػೳ͕͋ΔΘ͚Ͱͳ͍ Ϣʔβ͕ࣗͰʮҰͭલʹσϓϩΠ͍ͯͨ͠λεΫఆٛʯ ΛσϓϩΠ͢͠ ! ىಈޙʹಈతͳ͜ͱΛͳΔ͘͠ͳ͍ͷ͕ॏཁ !
ίϯςφىಈޙʹ࠷৽ίʔυΛϨϙδτϦ͔Βऔಘ " ίʔυΠϝʔδʹম͖ࠐΉ
σϓϩΠπʔϧ ͍Ζ͍Ζ͋Δ ecs-cli github.com/aws/amazon-ecs-cli ɹGo / docker-compose Ͱఆٛͨ͠ઃఆΛ ECS ʹσϓϩΠ
hako github.com/eagletmt/hako ɹRuby / ఆٛ YAML ecs-deploy github.com/silinternational/ecs-deploy ɹbash + aws-cli
σϓϩΠπʔϧࣗ࡞ ecspresso github.com/kayac/ecspresso 1. ݩʑίϯιʔϧૢ࡞ͰσϓϩΠ͍ͯͨ͠ͷ͕͋ͬͨ 2. aws-cli ͰऔಘͰ͖ΔλεΫఆٛJSONΛͦͷ··͏ͨΊʹ shell script
Λॻ͍ͨ 3. ίʔυ͕ෳࡶʹͳͬͨͷͰ Go + aws-sdk-go Ͱॻ͖ͦ͏ ͍ͭͷؒʹ͔ҭͬͯ͠·ͬͨ
ecspresso ͷಛ৭ λεΫఆٛ aws-cli Ͱѻ͏JSONΛͦͷ··͑Δ →ݱঢ়ಈ͍͍ͯΔͷΛͦͷ··ཧରʹͰ͖Δ JSON ͷதͷΛ࣮ߦ࣌ͷڥมͰஔͯ͠ొͰ͖Δ { "taskDefinition":
{ "cpu": "4 vCPU", "containerDefinitions": [ { "name": "app", "image": "prod/app:f6fb4dcc20",
{ "taskDefinition": { "cpu": "{{ env `VCPU_NUM` `4` }} vCPU",
"containerDefinitions": [ { "name": "app", "image": "{{ must_env `SERVICE` }}/app:{{ must_env `TAG` }}", VCPU_NUM : prod | staging ͰҟͳΔCPUΛՄมʹ SERVICE : prod | staging σϓϩΠઌͷڥΛΓସ͑Δ TAG : σϓϩΠ͝ͱʹมΘΔΠϝʔδͷλά ͻͱͭͷ JSON Λෳڥʹ͍ճͤΔͷͰҡ࣋ཧָ͕
ίϯςφͷൿಗใͷઃఆ ΠϝʔδʹൿಗใΛম͖ࠐΉͷආ͚͍ͨ ম͖ࠐΉͱ docker pull ͨ͠Βͦ͜ʹΔ ഁغ͍ͨ͠߹ɹΠϝʔδΛͯ͢ݸผʹഁغ͢Δ͔͠ͳ͍ → ڥมͰ͢ λεΫఆٛͰ
environment ઃఆͰ͖Δ͕ → λεΫఆٛࣗମฏจͰอଘ͞ΕΔ ɹݹ͍ใͷഁغΠϝʔδಉ༷ʹʹͳΔ
ͲͷΑ͏ʹڥมΛઃఆ͢Δ͔ λεΫىಈ࣌ʹ҆શͳͱ͜Ζ͔Βऔಘ ڥมʹઃఆ͔ͯ͠ΒϓϩηεΛىಈ͢Δ ҆શͳઃఆอଘॴ AWS Systems Manager (SSM) ύϥϝʔλετΞ
SSMύϥϝʔλετΞ
SSMύϥϝʔλετΞ • ֊Խͨ͠ path ໊ͰΛอଘ • ઃఆͷόʔδϣχϯάɺมߋऀͷཤ ྺཧ • KMSͰ҉߸Խͨ͠ΛอଘͰ͖Δ
• KMSͷݖݶ͕ͳ͚ΕಡΊ ͳ͍ • ίϯςφىಈ࣌ʹ͔͜͜ΒΛऔΓ ग़ͯ͠ڥมʹઃఆ͢ΕΑ͍
ύϥϝʔλετΞ͔ΒΛऔΓग़͢ aws-ssm-env github.com/jamietsao/aws-ssm-env $ aws-ssm-env --paths=/prod/ API_KEY=xxxxxx DB_PASS=productionpass entry point
ͷ sh Ͱ࣮ߦɺexport ͔ͯ͠Β exec ͢Δ #!/bin/sh export AWS_REGION=ap-northeast-1 export $(aws-ssm-env --paths=/prod/) exec /path/to/myapp
ύϥϝʔλετΞͷΛ export & exec ssmwrap github.com/handlename/ssmwrap ฐࣾಉ྅࡞ $ ssmwrap -paths=/prod/
-- /path/to/myapp ssm ͔Βऔಘͨ͠Λ env ʹઃఆͯ͠ exec ·Ͱͯ͘͠ΕΔ ɾexec ·Ͱ͢ΔͷͰ Docker ͷ entrypoint ʹࢦఆͰ͖Δ ɾshell scirpt Λܦ༝͠ͳ͍ͷͰվߦΛؚΉͷ͕ͳ͍ ɾ-retries ΦϓγϣϯͰϦτϥΠճΛࢦఆͰ͖Δ
SSMύϥϝʔλετΞͷ API Rate Limit ͕ݫ͠Ί େྔͷλεΫΛҰؾʹىಈ͢Δͱ Rate Limit Error (੍ݶαϙʔτʹ͍߹Θ͕ͤͨඇެ։)
ɾaws-ssm-env ΤϥʔʹͳΔͱ panic Ͱࢮ͵ ɹσϓϩΠ࣌ʹࢮΜͩλεΫ࠶ىಈ͞ΕΔ͕… ɾssmwrap -retries ઃఆͰϦτϥΠͰ͖Δ(͓નΊ) ɾىಈ࣌ʹ random sleep ͰλΠϛϯάΛͣΒͯ͠؇ ! ਖ਼ECSଆͰڥมʹઃఆͯ͠ىಈͯ͠΄͍͠
σϓϩΠख๏ͱൿಗใͷཧ ·ͱΊ • Blue-Green ͷརΛੜ͔ͤΔΑ͏ʹ͏ • SSMύϥϝʔλετΞศར • Ͱͬͱڧ͘ͳͬͯ΄͍͠ •
֤͍͖ࣗͯͬͯ͠·͠ΐ͏
ϩάͷूͱετϦʔϛϯάॲཧ
ϩάूͷੲͱࠓ ੲ (ʙ2011 Before Fluentd) ɾϑΝΠϧΛఆظతʹճऩ ɾλΠϜϥάେ
ϩάूͷੲͱࠓ ۙ (2012ʙ After Fluentd) ϑΝΠϧΛ fluentd ͕ஞ࣍ಡΈऔΓ ૹ৴ ΞϓϦέʔγϣϯ͕
fluentd ૹ৴ λΠϜϥάখ
ECS ͔Βͷϩάू ൃੜ͢Δϩάେ·͔ʹ3छྨ 1.ΞΫηεϩά 2.ΞϓϦέʔγϣϯ/ϛυϧΣΞ͕ ɹඪ४ग़ྗɺඪ४Τϥʔग़ྗʹు͖ग़͢ϩά 3.ΞϓϦέʔγϣϯతʹҙຯ͕͋Δߦಈϩά ΞΫηεϩά nginx ͔Β
/dev/stdout ʹग़ͤ2छྨ ͲͷΑ͏ʹूΊΔ͔
֤ίϯςφ͕ STDOUT, STDERR ʹు͖ग़ͨ͠ͷ Docker logging driver ʹΑͬͯѻΘΕΔ λεΫఆٛͰίϯςφ͝ͱʹࢦఆͰ͖Δ awslogs
: CloudWatch Logs ૹ৴ fluend : Fluentd ૹ৴ json-file : ϑΝΠϧอଘ syslog : syslogd ૹ৴ (ଞʹ͋Δ)
awslogs or fluentd? CloudWatch Logs ɹpros: ϚωʔδυͳͷͰԿߟ͑ͳͯ͘Α͍ ɹcons: ͔ͦ͜Βߋʹผʹྲྀ͢ͷ͕ଟগ໘ (Lambda
͕ඞཁ) Fluentd: ɹpros: ߦಈϩάଞͱಉ༷ͷѻ͍͕Ͱ͖Δ ɹcons: fluentdΛࣗͰཱͯΔඞཁ͕͋Δ
Fluentd ʹ౷Ұ͢Δ ߦಈϩάͲͪΒʹ͠Ζ Fluentd Ͱѻ͍͍ͨͷͰඞཁ ߦಈϩά ɾλεΫʹΞϓϦέʔγϣϯͱҰॹʹ fluentd Λஔ (sidecar)
ɾΞϓϦ͔Β localhost:24224 ʹૹ৴͢Δ(ߏԽϩά) STDOUT, STDERR ɾECSαʔϏεͱͯ͠ NLB Λհͯ͠ fluentd Λஔ ɾ֤λεΫ Docker logging driver Ͱ NLB:24224 ૹ৴͢Δ
None
ECS Ͱ fluentd ΛͲ͏͏͔ AWS ͷ߹ fluentd + plugin S3
Ͱ S3 อ͢Δͷ͕ఆ൪ S3 ͷॻ͖ग़͠ 1ʙ5 ఔʹ͢Δ ɹ͋·Γ͍ͱ S3 ͷΦϒδΣΫτ͕ࡉΕʹͳΔ) ো࣌ͷ͜ͱΛߟ͑ΔͱఔͰίϯςφͷόοϑΝ (ϝϞϦ or ϩʔΧϧϑΝΠϧ)ʹอଘ͢ΔͷফࣦϦεΫ → ৴པͷஔ͚ΔόοϑΝ͕΄͍͠
Kinesis Data Streams ͛ࠐΜͩϝοηʔδ(ϩάʹݶΒͳ͍)Λ24࣌ؒɺॱংΛอͬͯอͯ͘͠ΕΔετϦʔϛϯάॲཧج൫ͷϚωʔδυαʔϏε OSS Ͱ Apache Kafka ͕ྨࣅ ϩάΛ
S3 ʹॻ͖ग़͢લͷʮ৴པͰ͖ΔʯόοϑΝͱͯ͠࠷ద
Kinesis Data Firehose ετϦʔϛϯάσʔλΛఆظతʹ ɾS3 ɾRedshift ɾElasticsearch ʹॻ͖ग़͢ϚωʔδυαʔϏε ιʔεͱͯ͠ Kinesis
Streams Λ͑Δ
࠷ऴతʹ͜͏
ʮtail -f ͍ͨ͠ΜͰ͕͢ʯ ϩά͕ϑΝΠϧʹॻ͔Εͳ͘ͳͬͨ → tail -f Ͳ͏͢Δ? kinesis-tailf github.com/fujiwara/kinesis-tailf
Go + aws-sdk-go Ͱࣗ࡞ $ kinesis-tailf -stream docker-logs Kinesis Streams Λඌ͠ඪ४ग़ྗʹు ͖ग़͢ CLI -start -end ΦϓγϣϯͰಛఆ࣌ؒଳΛ நग़Մೳ
Τϥʔϩά͚ͩநग़͍ͨ͠ શϩάΛ kinesis-tailf | grep ? ྲྀྔ͕ଟ͍ͱͭΒ͍ Streams ͷσʔλΛ Lambda
Ͱॲཧ ύλʔϯʹϚονͨ͠ϩά͚ͩผͷ Streams ʹྲྀ͢͠ ɾαʔόΤϥʔ status:5 ɾॲཧʹ͕࣌ؒ3ඵҎ্ֻ͔ͬͨͷ ɹapptime:([3-9]|[1-9][0-9]+)\. ɾ(ERROR|WARN)
ϩά͔ΒͷΤϥʔ௨ S3 Event notification S3ʹΦϒδΣΫτ͕࡞/আ͞ΕͨΒ LambdaΛݺͿ Τϥʔநग़ετϦʔϜ͔Β S3 ͷΦϒ δΣΫτ͕ੜ͞ΕͨΒ
Slack ʹ௨ ΠϕϯτυϦϒϯͳόονॲཧʹ Firehose + S3 + Lambda ͕͑Δ
ϩά͔ΒͷΤϥʔ௨ நग़͞Εͨλάɺߦͱͱʹsnippetߘ Τϥʔൃੜ͔Β1Ͱ௨ େྔʹΤϥʔ͕ൃੜͯ͠1͝ͱʹ͔͠௨དྷͳ͍(ॏཁ)
ϩάͷूͱετϦʔϛϯάॲཧ ·ͱΊ • ϩά STDOUT/STDERR ʹग़ྗ Docker Logging Driver Ͱૹ৴
• Fluentd + ৴པͰ͖ΔόοϑΝͱͯ͠ͷ Kinesis Streams • Firehose + S3 + Lambda ͰΠϕϯτυϦϒϯͳσʔλॲཧ
GoݴޠʹΑΔ ӡ༻πʔϧ/ϛυϧΣΞ։ൃ
AWS / ECS 伱͕ؒଟ͍ ࠓճࣗલͰ։ൃͨ͠ͷ ecspresso github.com/kayac/ecspresso σϓϩΠπʔϧ ssmwrap github.com/handlename/ssmwrap
SSM ύϥϝʔλετΞͷΛڥมʹઃఆͯ͠ exec kinesis-tailf github.com/fujiwara/kinesis-tailf Kinesis StreamsΛඌ͢Δ
伱ؒՈ۩Λࣗ࡞͢Δ 伱ؒΛຒΊΔπʔϧɺϛυϧΣΞΛ։ൃͯ͠ӡ༻վળ খ͘͞ɺదʹ൚༻తͳͷΛ࡞Δ ຊՈ͕伱ؒΛຒΊͨΒࣺͯΒΕΔΑ͏ʹ
伱ؒՈ۩ͷྫ Rin github.com/fujiwara/Rin Redshift data Importer by SQS messaging. S3
Πϕϯτ௨Ͱ SQS ʹૹ৴ SQS ͷϝοηʔδ͔Β Redshiftʹ copy ͯ͠औΓࠐΈΛߦ͏πʔϧ 2015.05 ʹ։ൃ 2015.10 Firehose ൃද 2017.07 ౦ژϦʔδϣϯʹ Firehose
Before / After Fluentd ͔ΒϩάΛૹ৴ S3 / Redshift ʹॱ࣍औΓ͜·ΕΔ ͱ͍͏ߏͦͷ··Ϛωʔδυʹ
πʔϧ։ൃݴޠͱͯ͠ͷ Go γϯάϧόΠφϦʹͳΔ ϥϯλΠϜෆཁ ίϯςφͷϕʔεΠϝʔδΛબͳ͍ ॻ͖͢͞ΑΓಡΈ͢͞Λॏࢹ → ϝϯςφϯεੑ͕ߴ͍ aws-sdk-go ػೳɺΞοϓσʔτਃ͠ͳ͍
͍উखਖ਼ඍົͳͱ͜Ζ͕…
ίϯςφڥ͚ͷ։ൃ Tips ίϚϯυϥΠϯΦϓγϣϯͷΛڥม͔ΒಡΉ1 func main() { var port int var
host string flag.IntVar(&port, "port", 8080, "port number") flag.StringVar(&host, "host", "localhost", "hostname") flag.VisitAll(func(f *flag.Flag) { if s := os.Getenv(strings.ToUpper(f.Name)); s != "" { f.Value.Set(s) } }) flag.Parse() fmt.Printf("%s:%d\n", host, port) } 1 https://mattn.kaoriya.net/software/lang/go/20170609110526.htm
ίϚϯυϥΠϯΦϓγϣϯͷΛڥม͔ΒಡΉ $ myapp -host example.com -port 9999 example.com:9999 $ HOST=example.com
PORT=9999 myapp example.com:9999 ίϯςφͰίϚϯυϥΠϯΑΓ ڥมͷ΄͏͕ઃఆ͍͢͠
ઃఆϑΝΠϧʹڥม͔ΒΛຒΊࠐΉ github.com/kayac/go-config Go ͷઃఆϑΝΠϧಡΈࠐΈ package # yaml account_id: "{{ must_env
`MY_ACCOUNT_ID` }}" profile: "{{ env `PROFILE` `default` }}" must_env: ઃఆ͞Εͳ͍ঢ়ଶͰ࣮ߦ͞ΕΔͱ panic env: ઃఆ͞Ε͍ͯͳ͍߹σϑΥϧτΛࢦఆ YAML / JSON / TOML ʹରԠ
ઃఆϑΝΠϧΛϦϞʔτ͔Βऔಘ͢Δ ઃఆ͕ϑΝΠϧʹͳ͍ͬͯΔͱ มߋͷࡍʹίϯςφͷ࠶Ϗϧυ & Ξοϓϩʔυ͕ඞཁ (ࢼߦࡨޡ͕໘) File / S3 /
HTTP ͰऔಘͰ͖ΔΑ͏ʹ࡞͓ͬͯ͘ͱศར2 $ CONFIG=s3://my-config-bucket/config.yaml mydaemon 2 GoͰHTTPͱS3Λಁաతʹѻ͏ https://shogo82148.github.io/blog/2018/06/09/go-s3-protocol/
OSS ͱͯ͠࡞Δ OSS ʹͯ͠͠·͏ (ԾʹࣗΒ͔͠Θͳͯ͘) README ͙Β͍ؤுͬͯॻ͘(ϞνϕʔγϣϯʹͳΔ) աͳࣾࣄͷࠞೖΛ͙ ʮͦͷϓϩδΣΫτҎ֎ʹҙຯ͕͋Δػೳͳͷ͔?ʯ ίϐϖͰຐվ൛͕૿৩͢ΔͷΛ͙
ʮGitHubͰόΠφϦఏڙͯ͠ΔͷͰͦΕΛ͍ͬͯͩ͘͞ʯ
GoݴޠʹΑΔ ӡ༻πʔϧ/ϛυϧΣΞ։ൃ ·ͱΊ • AWS / ECS ͷ伱ؒΛখ͘͞ॻ͍ͨπʔϧͰຒΊΑ͏ • ͋͑ͯOSSʹ͢Δ͜ͱͰ͖Ε͍ʹอͭ
• Go ίϯςφڥͰ͍উख͕Α͍
Questions? • Amazon ECS Ͱͷαʔόߏஙͱӡ༻ • σϓϩΠख๏ͱൿಗใͷཧ • ϩάͷूͱετϦʔϛϯάॲཧ •
GoݴޠʹΑΔӡ༻πʔϧ/ϛυϧΣΞ։ൃ