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
Amazon ECS とマネージドサービスを活用したフルコンテナ構成によるゲームサーバの構築と...
Search
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
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
530
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
8
2.1k
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
9
6.1k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
2
400
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
14k
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
9
6.9k
alecthomas/kong はいいぞ
fujiwara3
7
2.6k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
3.8k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
4
5.6k
Other Decks in Technology
See All in Technology
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
9
990
Reactの設計論
uhyo
24
13k
Issue 駆動でスペシャリストの意図を届ける、AI 実装のアクセシビリティ向上
thkt
0
120
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
25
16k
作品が生態系になった ─ Mini Tokyo 3D から世界へ
nagix
0
190
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
1.8k
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
1
2.8k
Goodbye ShellScript, Hello File-based App
shunsock
0
140
絵ではじめるKubernetesセキュリティ
aoi1
4
650
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
140
AIで社員の自主発信に広報目線を組み込む
_mossann_t
0
110
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.3k
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.2k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Designing Powerful Visuals for Engaging Learning
tmiket
1
550
Deep Space Network (abreviated)
tonyrice
0
310
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
540
Building AI with AI
inesmontani
PRO
1
1.2k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
540
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
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ݴޠʹΑΔӡ༻πʔϧ/ϛυϧΣΞ։ൃ