Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KinesisとLambdaでつくるServerlessなログ基盤 @ AWS DevDay Tokyo 2019 [C-2]

KinesisとLambdaでつくるServerlessなログ基盤 @ AWS DevDay Tokyo 2019 [C-2]

本セッションでは、弊社にて複数サービスで導入しているAWSのマネージドサービス (Lambda、CloudWatch Logs、Kinesis Data Streams、S3、Elasticsearch Service) を活用したServerlessなログ基盤の構成について紹介する。自前でログ基盤を管理しているが管理コストなど課題を感じている人や、コンテナ活用時のロギング構成の設計に悩んでいる人をターゲットにしている。 / / 現在のログ基盤の構成に至るまでの経緯(過去に試行錯誤した10以上の構成パターン)、設計思想(保守性、高信頼性、コスト削減、拡張性)について紹介する。 / / タップル誕生やCROSSMEをはじめとした実際に運用中のサービスを事例に、サービス用件ごとに合わせたロギング構成を解説する。また、2年半の期間で様々な構成を運用をしてきた事によって得られた知見について話す。ログ転送パターンの比較では、Kinesis SDK、fluentd plugin、CloudWatch Logs Subscription Filterを活用したログ転送や、end-to-end転送遅延に対する厳しい要件を持つサービスにおいて、fluentd集約からKinesis集約に切り替えた事によるメリットについて解説する。Kinesis Data Streamsをロギングやストリーミングアプリケーションで使った際の注意すべき事項やおすすめする使い方も合わせて紹介する。 / / ログ基盤で弊社で開発、活用されているロギング用 AWS LambdaモジュールのOSSプロジェクト (github.com/baikonur-oss) を紹介する。

Speaker Profile:

株式会社サイバーエージェント
Torgayev Tamirlan 氏

株式会社サイバーエージェント 技術本部 サービスリライアビリティグループ所属 クラウド技術アドバイザ / 2017年~内定者アルバイトを経て、2018年に新卒入社 / Kinesis、ECS、Lambda、Elasticsearch、Terraformを専門領域とし、複数の新規サービス立ち上げや、AWA・タップル誕生などのシステム改善に従事している

Tamirlan 893 Torgayev

October 03, 2019
Tweet

More Decks by Tamirlan 893 Torgayev

Other Decks in Technology

Transcript

  1. KinesisͱLambdaͰͭ͘Δ

    Serverlessͳϩάج൫
    Torgayev Tamirlan (@prog893)
    CyberAgent, Inc.

    View Slide

  2. • 2018೥ αΠόʔΤʔδΣϯτ৽ଔೖࣾ
    • Cloud Technologies Advisor = (SA+SRE+DevOps+Infra) / 4
    • AWSϝΠϯͰ༷ʑͳαʔϏεΛαϙʔτ
    • AWA: DB෮چߴ଎Խ (12h→55m)ɺ

    ECS EC2 εέʔϧΠϯอޢ
    • Torte্ཱͪ͛
    • AWAɺλοϓϧ஀ੜɺCROSS MEɺREQU
    • ܭ13αʔϏε୲౰
    • ޷͖ͳAWSͷαʔϏε: ECS
    ࣗݾ঺հ
    Torgayev Tamirlan

    @prog893

    View Slide

  3. ࠓ೔࿩͢͜ͱ
    • KinesisɺKinesis+Lambdaͷબఆཧ༝
    • ͜ΕΒΛར༻͍ͯ͠Δ͍͔ͭ͘ͷฐࣾαʔϏεͷ

    ϩΪϯάΞʔΩςΫνϟΛ঺հ
    • ࠷ޙʹͪΐͬͱͨ͠αϓϥΠζ͋Γ

    View Slide

  4. ࠓ೔࿩͞ͳ͍͜ͱ
    • fluentdͷࡉ͔͍࿩
    • Kinesis/Lambda/S3/ES/… is Կ
    • ঺հ͢ΔαʔϏεͷόοΫΤϯυͷৄࡉ (ݴޠɺߏ੒ɺetc.)
    • Internal BI΍Contents moderationج൫ͷৄࡉ

    View Slide

  5. Disclaimer
    • fluentdΛࣺͯΔ࿩Λ͠·͕͢ɺfluentd͕ݏ͍ͱ͍͏Θ͚Ͱ͸ͳ͍
    • Ή͠Ζ޷͖
    • fluentdͷݕূɺߏங͕ฐࣾͰͷ࠷ॳͷ࢓ࣄͰɺ

    ͦΕ͕ͳ͚Ε͹ਖ਼ࣜೖࣾͰ͖͍ͯͳ͍͔΋͠Εͳ͍
    • fluentd΍flumeͷΑ͏ͳϛυϧ΢ΣΞ͕ద੾Ͱ͋Δࣄྫ΋ͨ͘͞Μ͋Δ
    • ֤αʔϏεͷཁ๬ۦಈͰಈ͘ϩʔϧͱͯ͠ಇ͍͍ͯΔͷͰѱ͔͠Βͣ

    View Slide

  6. How we did it before
    ैདྷͷϩάసૹύλʔϯ΍՝୊

    View Slide

  7. • ֤αʔό/ίϯςφͰfluentdΛDaemon/Sidecarͱͯ͠৐ͤͯϩάసૹ
    • ͦͷDaemon/sidecar͕࠷ऴతͳ֨ೲઌ (Ҏޙsink) ʹ௚઀֨ೲ
    EC2
    ΞϓϦ + fluentd
    daemon
    S3 Bucket
    ϩάͷอଘ
    Internal BI
    fluentd endpoint
    Contents Moderation
    fluentd endpoint
    ैདྷͷϩάసૹ: ௚઀֨ೲύλʔϯ

    View Slide

  8. ैདྷͷϩάసૹ: ू໿ύλʔϯ
    • ֤αʔό/ίϯςφͰfluentdΛDaemon/Sidecarͱͯ͠৐ͤͯϩάసૹ
    • fluentd Aggregator (Active/Active৑௕Խ) ͰϩάΛू໿͠ɺsinkʹసૹ
    ECS Service
    ΞϓϦ+fluentd

    ίϯςφ૬৐Γ
    EC2
    fluentd aggregator
    S3 Bucket
    ϩάͷอଘ
    Internal BI
    Kinesis ingest
    Contents Moderation
    Kinesis ingest
    ΞϓϦέʔγϣϯ͕ࢮΜͰ΋ɺ

    ϩά͕ू໿αʔό·Ͱಧ͍͍ͯΕ͹0,
    TJOL͕ཷ·͍ͬͯͯ΋

    ू໿αʔό͸ͣͬͱ͍ΔͷͰ

    ϦτϥΠͰ͖Δ


    View Slide

  9. ैདྷͷ՝୊఺
    • ϝϯςφϯείετ
    • εέʔϧΞ΢τɾεέʔϧΠϯͷखؒɺ֦ுίετ
    • ू໿αʔό૿ݮ΍sink௥ՃͰDaemon/SidecarͷίϯϑΟάमਖ਼ɺ

    σϓϩΠ͕ൃੜ
    • ܽଛϦεΫ
    • όοϑΝૹΓ͖ͬͯͳ͍αʔόͷεέʔϧΠϯͳͲʹΑΔαʔϏεΞ΢τ
    • ઃఆΛؒҧ͑ΔͱɺόοϑΝᷓΕͳͲͰܽଛɺࣄނൃੜ

    View Slide

  10. Logging Challenges
    ϩάج൫ͷߏ੒ʹର͢Δཁ݅ͱ՝୊

    View Slide

  11. Logging Challenges
    1.৴པੑ
    2.ϝϯςφϯείετ
    3.εέʔϥϏϦςΟ
    4.֦ுੑ
    5.൚༻ੑ

    View Slide

  12. Challenge: ৴པੑ
    • ϚονϯάαʔϏεͷΑ͏ͳϩάཁ͕݅ݫ͍͠αʔϏεͰ͸ɺ

    ΄ͱΜͲͷϩάʹର͢Δཁ͕݅׬શʹܽଛͳ͠
    • Contents moderation༻ͷϩά΍ΞΫηεϩάΛؚΉ
    • ALBͷΞΫηεϩά͚ͩͰ͸μϝͩͬͨΓ
    • ܽଛͨ͠ࡍͷϦτϥΠػߏɺյΕͨϩά͕ྲྀΕͨͱ͖ͷٹग़ϑϩʔ͕ඞཁ
    • fluentdͷίϯϑΟάͰ΋Ͱ͖Δ͕ɺίϯϑΟά͕RubyͩΒ͚ʹͳΓɺ

    ϝϯςφϯείετ૿Ճ

    View Slide

  13. Challenge: ϝϯςφϯείετ
    • Sidecar/Daemon fluentd (ͳͲͷϛυϧ΢ΣΞ) Λར༻͢Δͱɺ

    ͦΕΒͷ؅ཧɺϝϯςφϯε͕ඞཁ
    • ͞Βʹɺू໿ύλʔϯͰ͸ू໿αʔόͷ໘౗Λݟͳ͍ͱ͍͚ͳ͍
    • ͕ͦ͜μϝʹͳΔͱશ෦μϝ
    • σΟεΫɺࢮ׆؂ࢹɺfluentdόοϑΝঢ়ଶɺηΩϡϦςΟύον΍

    OSߋ৽ͳͲ

    View Slide

  14. Challenge: εέʔϥϏϦςΟ
    • ؆୯ʹεέʔϦϯάͰ͖ΔΑ͏ʹ͍ͨ͠
    • ؆୯ = αʔόߏஙɺAnsibleྲྀ͠ΑΓ؆୯
    • ϩάͷग़ྗ͕ஶ͘͠૿͑Δ͜ͱ͕૝ఆ͞Εͳ͍ͷͰɺ

    ΦʔτεέʔϦϯά͸ඞਢͰ͸ͳ͍
    • σΟεΫ༰ྔ΍όοϑΝαΠζΑΓεϧʔϓοτϕʔεͰ

    ύϑΥʔϚϯεΛࢦఆ͍ͨ͠
    • ͪ͜Βͷํ͕DevOps΍SRE͡Όͳ͍։ൃऀʹͱͬͯҰ൪Θ͔Γ΍͍͢

    View Slide

  15. Challenge: ֦ுੑ
    • ֨ೲઌ͕૿͑Ε͹ɺ҆қʹߦ͑ΔΑ͏ʹ͍ͨ͠
    • ྫ: KibanaΛ࢖ͬͨϩάՄࢹԽΛಋೖ͍ͨ͠
    • ҆қ:
    • ΞϓϦέʔγϣϯͷσϓϩΠͳ͠
    • ΞʔΩςΫνϟมߋͳ͠

    View Slide

  16. Challenge: ൚༻ੑ
    • ͲͷΑ͏ͳαʔϏε΍ཁ݅ʹ΋ରԠͰ͖Δ
    • ࠶ݱੑ͕͋ΓɺಛఆͷαʔϏεɾཁ݅ʹґଘ͠ͳ͍
    • χʔζʹ߹Θͤͯඍௐ੔Ͱ͖Δ
    • ࠶ར༻ & ࣗ༝ʹ૊Έ߹Θ͕ͤՄೳ

    View Slide

  17. After *a lot* of 

    sleepless nights. . .
    ਺͖͑Εͳ͍຾Ε͵໷Λܦͯʜ

    View Slide

  18. Serverless Logging with

    Kinesis and Lambda
    ,JOFTJTͱ-BNCEBΛ׆༻ͨ͠ϩάج൫ͷߏ੒

    View Slide

  19. ͳͥ Kinesis
    • Buffer΍ʮ༰ྔʯͱ͍͏֓೦͕ͳ͍
    • อ࣋ظؒɺεϧʔϓοτ͚ͩؾʹ͢Ε͹ྑ͍
    • ௚ײతͳύϑΥʔϚϯεઃఆ
    • 1γϟʔυ͋ͨΓͷεϧʔϓοτ͕ܾ·͍ͬͯͯɺ

    εϧʔϓοτΛ૿΍͚ͨ͠Ε͹γϟʔυΛ૿΍͚ͩ͢
    • reshard͕ࣗಈͰߦΘΕΔ

    View Slide

  20. ͳͥ Kinesis + Lambda
    • Kinesis + Lambda Event Source MappingͰ͸ɺϦτϥΠ͕ࣗಈ
    • Lambda͕ࣦഊ͢Ε͹ɺಉ͡σʔλͰ࠶࣮ߦ
    • ͦͷσʔλ͕ࣦޮ OR Lambdaͷ࣮ߦ͕੒ޭͰऴྃ͢Δ·ͰϦτϥΠ

    (ͲͪΒ͔ૣ͍ํ)
    • Kinesis্ͷσʔλΛͲ͜·Ͱॲཧ͔ͨ͠ͷϙδγϣϯ؅ཧ΋͞ΕΔ
    • ࣗલͰ༻ҙ͢Δ΋ͷ͸σʔλͷॲཧ΍సૹ༻ͷ࢓૊Έ͚ͩ! ָνϯ!

    View Slide

  21. ߏ੒ v1
    • Kinesis Streams -> Lambda -> ֤छ sink (S3/ES/Internal BI etc.)
    • Kinesis΁ͷ֨ೲ͸αʔϏεͷཁ݅ʗঢ়ଶʹΑΔ
    • ૬৐Γfluentd + aws-fluent-plugin-kinesis
    • Kinesis APIͰΞϓϦέʔγϣϯͷίʔυ͔Β௚઀֨ೲ

    View Slide

  22. ࣄྫ1: λοϓϧ஀ੜ
    ECS Service
    ΞϓϦ+fluentd

    ίϯςφ૬৐Γ
    EC2
    fluentd aggregator
    KDS
    to Elasticsearch
    S3 Bucket
    ϩάͷอଘ
    Lambda
    lambda-kinesis-to-es
    Elasticsearch Service
    ϩάௐࠪ with Kibana
    fluentd + aws-fluent-plugin-kinesis
    KDS
    to BI
    Internal BI
    Kinesis ingest
    KDS
    to Contents Moderation
    Contents Moderation
    Kinesis ingest
    fluentd + aws-fluent-plugin-kinesis
    fluentd + aws-fluent-plugin-kinesis

    View Slide

  23. ࣄྫ2: CROSSME
    EC2
    ΞϓϦ
    KDS
    to BI
    Kinesis SDKసૹ
    Internal BI
    Kinesis ingest
    KDS
    to Contents Moderation
    Contents Moderation
    Kinesis ingest
    KDS
    to Elasticsearch
    Lambda
    lambda-kinesis-to-es
    Elasticsearch Service
    ϩάௐࠪ with Kibana
    Kinesis SDKసૹ
    Kinesis SDKసૹ Lambda
    lambda-kinesis-to-es
    S3 Bucket
    ϩάͷอଘ

    View Slide

  24. ࣄྫ3: REQU
    S3 Bucket
    ϩάͷอଘ
    KDS
    to Elasticsearch
    Lambda
    lambda-kinesis-to-es
    Elasticsearch Service
    ϩάௐࠪ with Kibana
    KDS
    to Contents Moderation
    Lambda
    lambda-kinesis-to-s3
    ECS Service
    ΞϓϦ
    Kinesis SDKసૹ
    Kinesis SDKస

    Contents Moderation
    Kinesis ingest

    View Slide

  25. Logging Challenges ౴͑߹Θͤ
    1. ৴པੑ: KinesisͰͷू໿ɺKinesis+LambdaͷϦτϥΠػߏ
    2. ϝϯςφϯείετ: ServerlessɺFull-Managed
    3. εέʔϥϏϦςΟ: Kinesisγϟʔυ௥ՃɺࣗಈϦγϟʔυ
    4. ֦ுੑ: LambdaϞδϡʔϧΛ޷͖ʹ૊Έ߹ΘͤͰ͖Δ
    5. ൚༻ੑ: ͲͷαʔϏεͷཁ๬ʹ΋ରԠͰ͖ΔLambdaϞδϡʔϧͷ։ൃ

    View Slide

  26. Feedback
    • ʮू໿༻fluentd͕ࣺͯΒΕͯؾ͍͍࣋ͪɺ࢒ͬͨ΋ͷ΋ࣺ͍ͯͨʯ
    • ʮfluent-plugin-kinesisʹཔΓͨ͘ͳ͍ʯ
    • ʮfluent-plugin-kinesisͷόοϑΝઃఆͳͲconfͷ؅ཧ͕ΊΜͲ͍ʯ
    • ʮKinesis APIΛୟ͘ύλʔϯͰɺfluentd૬౰ͷ࣮૷Λͨ͘͠ͳ͍ʯ

    View Slide

  27. Serverless Logging with

    Kinesis and Lambda
    ͞ΒʹਐԽͨ͠,JOFTJTͱ-BNCEBΛ׆༻ͨ͠ϩάج൫ͷߏ੒
    *Better

    View Slide

  28. Serverlessͳϩάج൫ͷߏ੒
    • ׬શʹfluentdͳͲͷϛυϧ΢ΣΞ͞Α͏ͳΒύλʔϯ
    • ECS -> stdout -> CWL -> CWL Subscription Filters -> 

    Kinesis “router” -> Lambda forwarder -> Kinesis sinks/S3/ES
    • Internal BIπʔϧ΍Contents moderationج൫͸ɺͦΕͧΕͷ։ൃνʔϜͱ

    ࿈ܞ͠ɺ֤AWSΞΧ΢ϯτͷKinesisετϦʔϜ͔ΒಡΈࠐΉΑ͏ʹมߋ
    • EC2΋CloudWatch Agentར༻͢Ε͹࢖͑Δ

    View Slide

  29. ࣄྫ4: ։ൃத৽نαʔϏεx2
    S3 Bucket
    ϩάͷอଘ
    Lambda
    lambda-kinesis-to-es
    Elasticsearch Service
    ϩάௐࠪ༻ES+Kibana
    Lambda
    lambda-kinesis-to-s3
    KDS
    router
    Internal BI
    Kinesis ingest
    CloudWatch
    Logs
    Lambda
    lambda-kinesis-forward
    KDS
    to BI
    KDS
    to Contents Moderation
    Contents Moderation
    Kinesis ingest
    ※ lambda-kinesis-forward͕ΫϦςΟΧϧύεʹͳΓɺ

    શͯͷΠϕϯτΛऔಘ͢Δඞཁ͕͋ΔͷͰEFOར༻͕Φεεϝ
    ECS Service
    ΞϓϦ
    CloudWatch Logs
    Subscription Filters

    View Slide

  30. ஫ҙ: 

    CloudWatch LogsͷPutLogEvents͸ߴ͍ 

    (Kinesis΋...҆͘͸ͳ͍)
    ࡳଋ Ͱ৴པੑΛങ͍ͬͯΔΑ͏ͳ΋ͷ
    ͨͩɺྫ͑͹ECSͷϩΪϯάυϥΠόͰKinesis΁ͷ֨ೲ͕Ͱ͖ΔΑ͏ʹ
    ͳͬͨͱͯ͠΋ɺKinesisͷΩϟύ΍ϩάपΓLambdaͷෆ۩߹ͳͲ͔Β
    ϩάΛकΔͨΊͷόοΫΞοϓ͕ཉ͍͠

    View Slide

  31. About Baikonur OSS
    #BJLPOVS044ϓϩδΣΫτʹ͍ͭͯ

    View Slide

  32. Baikonur OSS Project
    • Terraform Module΍֤छπʔϧͷڞ௨ԽϓϩδΣΫτ
    • GitHub.comɺTerraform Module Registry
    • ฐࣾͰ։ൃɺར༻͍ͯ͠ΔϞδϡʔϧΛॱ࣍OSSԽ
    • ฐࣾ಺: AWSϞδϡʔϧ23छྨ
    • ໊લͷ༝དྷɿόΠίψʔϧӉ஦ج஍
    • ͦͷ··࢖͑Δɺ͙͢ల։Ͱ͖ΔϕετϓϥΫςΟε

    View Slide

  33. Baikonur OSS modules
    • ຊ೔঺հͨ͠શͯͷLambda͸BaikonurͰ঺հ͞Ε͍ͯ·͢
    • ָʹߏங͕Ͱ͖ΔTerraform Module΋ఏڙ
    • ฐࣾ಺Ͱ࢖͍ͬͯΔ΋ͷΛͦͷ··ެ։

    View Slide

  34. View Slide

  35. View Slide

  36. ൪֎: eden
    • ECS Dynamic Environment Manager = eden
    • ECSͷ։ൃ؀ڥΛಈతʹ࡞੒͢Δπʔϧ΋Baikonur OSSͰެ։
    • ৄࡉ: http://bit.ly/awseden

    View Slide

  37. Kinesis Caveats
    ,JOFTJTΛར༻͢Δʹ͋ͨͬͯ஫ҙ͢΂͖ͱ͜Ζ

    View Slide

  38. Scaling
    • γϟʔυ਺มߋͰͰ͖ͳ͍͜ͱ (υΩϡϝϯςʔγϣϯ) :
    • 24࣌ؒͰ3ճҎ্ͷγϟʔυ਺มߋ
    • ݱࡏͷγϟʔυ਺ΑΓ2ഒΑΓଟ͍ɺ൒෼ΑΓগͳ͍γϟʔυ਺΁ͷมߋ
    • 500γϟʔυΑΓଟ͍γϟʔυ਺΁ͷมߋ
    • 500γϟʔυΑΓଟ͍γϟʔυΛ࣋ͭετϦʔϜͷεέʔϧμ΢ϯෆՄ
    • ΞΧ΢ϯτ୯Ґͷγϟʔυ਺ͷ্ݶͷಥഁ
    • શ෦্ݶ؇࿨Մೳ

    View Slide

  39. Autoscaling
    • ΦʔτεέʔϦϯά͸ఏڙ͞Ε͍ͯͳ͍
    • awslabs/amazon-kinesis-scaling-utils Λ࢖͑͹ΦʔτεέʔϦϯάͬΆ͍

    ͜ͱ͕Ͱ͖Δ
    • ࢲͷܦݧͰ͸ΦʔτεέʔϦϯά͕ඞཁʹͳͬͨ͜ͱ͸ͳ͍
    • ॻ͖ࠐΈɺಡΈࠐΈࣦഊ਺ͷ؂ࢹΛ௥Ճ͠ɺ

    ҟৗݕ஌ΛτϦΨʔʹखಈͰγϟʔυ૿ՃͰ͖Ε͹े෼
    • Capacity ExceededͰϦτϥΠ͢ΔϩδοΫ֤ॴͰ࣮૷ࡁΈ
    • ্هscaling-utilsΛPythonͰॻ͖௚ͯ͠কདྷతʹΦʔτεέʔϧ͢Δ͔΋

    View Slide

  40. Read Capacity: transactions໰୊
    • Kinesis+LambdaͰ͸ɺ1γϟʔυ͋ͨΓಉ͡Lambda͕

    ಉ࣌ʹ1ճͷΈ࣮ߦ͞ΕΔ
    • ಡΈࠐΈεϧʔϓοτʹ͸ɺ5 transactions/secͱ͍͏੍ݶ͕͋Δ
    • 1 Lambda࿈ܞ1γϟʔυ͋ͨΓ~1 transaction/sec͕ফඅ͞ΕΔ
    • ॲཧͰ͖Δ৽͍͠σʔλ͕ͳ͍͔ͷ֬ೝΛຖඵ࣮ߦ
    • 3 LambdaҎ্ར༻͍ͨ͠৔߹ɺ3ͭ໨Ҏ߱͸ EFO Pipes Ͱઐ༻εϧʔϓοτ֬อ
    • Enhanced Fan-out

    View Slide

  41. Conclusion
    ૯ׅ

    View Slide

  42. ૯ׅ
    • ؾܰʹ֦ுՄೳͳϩάपΓΞʔΩςΫνϟΛ࣮ݱ
    • KinesisͱLambdaͷ׆༻ͰServerlessߏ੒
    • ϝϯςφϯείετݮ
    • Kinesis + Lambda࿈ܞͰࣗಈϦτϥΠ
    • ࣮૷Ͱ͸ϦτϥΠػߏΛ࣮૷͢Δඞཁ͕ͳ͘ɺΤϥʔॲཧͷΈͰे෼
    • ڞ௨ԽɺOSSԽʹΑͬͯಋೖίετݮ

    View Slide

  43. Thank you for listening!
    ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide