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
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
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
9
4.5k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
2
330
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
11k
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
9
6.7k
alecthomas/kong はいいぞ
fujiwara3
7
2.5k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
3.7k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
3
4.1k
監視のこれまでとこれから/sakura monitoring seminar 2025
fujiwara3
12
5.8k
k6による負荷試験 入門から日常的な実践まで/Re:TechTalk #01
fujiwara3
2
610
Other Decks in Technology
See All in Technology
製造業のクラウド活用最適解〜AI,DXを加速するデータ基盤の作り方〜
hamadakoji
0
430
OCI Oracle AI Database Services新機能アップデート(2026/03-2026/05)
oracle4engineer
PRO
0
320
ポケモンの型をTypeScriptの型システムで表現してみた
subroh0508
0
360
Reliability in the Age of AI: Engineering for AI Velocity
rrreeeyyy
0
120
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
3.3k
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
170
あなたの AI ワークスペースに、 専門コーダーを連れてくる - Amazon Quick Desktop 最新情報
kawaji_scratch
1
120
AWSシリコン最前線 〜AI時代のチップ選択を読み解く〜
htokoyo
2
310
サプライチェーンセキュリティの空白地帯 - 信頼できる”依存性”の未来を考える
rung
PRO
2
800
チームで実践する AI-DLC 思考の軌跡を残すチェックポイント設計
belongadmin
0
3.1k
Taking back control of your AI development
inesmontani
PRO
0
110
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
4
1.2k
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
310
The untapped power of vector embeddings
frankvandijk
2
1.7k
How to make the Groovebox
asonas
2
2.2k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
210
Statistics for Hackers
jakevdp
799
230k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.4k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
Tell your own story through comics
letsgokoyo
1
950
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
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ݴޠʹΑΔӡ༻πʔϧ/ϛυϧΣΞ։ൃ