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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
340
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
新規事業を牽引する技術選定 〜フルスタックTypeScript開発の実践事例〜
nullnull
3
380
Socrates × Looker 〜セマンティックレイヤーで進化するデータ分析エージェント〜
hanon52_
3
2k
日本 Fintech 未来予測レポート 2027〜2028年(オリジナル版)
8maki
0
1.2k
MCP Appsを作ってみよう
iwamot
PRO
4
470
Android の公式 Skill / Android skills
yanzm
0
120
作って終わりにしない タイミーのセマンティックレイヤー育成の現在地
chanyou0311
3
2.1k
Snowflakeと仲良くなる第一歩
coco_se
4
410
小さく始める AI 活用推進 ― 日経電子版 Web チームの事例/nikkei-tech-talk47
nikkei_engineer_recruiting
0
190
"何を作るか"を任される エンジニアは、どう育つのか
yutaokafuji
1
580
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.9k
チームで進めるAI駆動アジャイル×ウォーターフォール
kumaiu
0
150
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
120
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
390
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
440
First, design no harm
axbom
PRO
2
1.2k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Rails Girls Zürich Keynote
gr2m
96
14k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
A better future with KSS
kneath
240
18k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
How to Talk to Developers About Accessibility
jct
2
230
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ݴޠʹΑΔӡ༻πʔϧ/ϛυϧΣΞ։ൃ