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・タップル誕生などのシステム改善に従事している

563d2e1e4cabf5ca21404f7104c90e91?s=128

Tamirlan Torgayev

October 03, 2019
Tweet

Transcript

  1. KinesisͱLambdaͰͭ͘Δ
 Serverlessͳϩάج൫ Torgayev Tamirlan (@prog893) CyberAgent, Inc.

  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
  3. ࠓ೔࿩͢͜ͱ • KinesisɺKinesis+Lambdaͷબఆཧ༝ • ͜ΕΒΛར༻͍ͯ͠Δ͍͔ͭ͘ͷฐࣾαʔϏεͷ
 ϩΪϯάΞʔΩςΫνϟΛ঺հ • ࠷ޙʹͪΐͬͱͨ͠αϓϥΠζ͋Γ

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

    • Internal BI΍Contents moderationج൫ͷৄࡉ
  5. Disclaimer • fluentdΛࣺͯΔ࿩Λ͠·͕͢ɺfluentd͕ݏ͍ͱ͍͏Θ͚Ͱ͸ͳ͍ • Ή͠Ζ޷͖ • fluentdͷݕূɺߏங͕ฐࣾͰͷ࠷ॳͷ࢓ࣄͰɺ
 ͦΕ͕ͳ͚Ε͹ਖ਼ࣜೖࣾͰ͖͍ͯͳ͍͔΋͠Εͳ͍ • fluentd΍flumeͷΑ͏ͳϛυϧ΢ΣΞ͕ద੾Ͱ͋Δࣄྫ΋ͨ͘͞Μ͋Δ

    • ֤αʔϏεͷཁ๬ۦಈͰಈ͘ϩʔϧͱͯ͠ಇ͍͍ͯΔͷͰѱ͔͠Βͣ
  6. How we did it before ैདྷͷϩάసૹύλʔϯ΍՝୊

  7. • ֤αʔό/ίϯςφͰfluentdΛDaemon/Sidecarͱͯ͠৐ͤͯϩάసૹ • ͦͷDaemon/sidecar͕࠷ऴతͳ֨ೲઌ (Ҏޙsink) ʹ௚઀֨ೲ EC2 ΞϓϦ + fluentd

    daemon S3 Bucket ϩάͷอଘ Internal BI fluentd endpoint Contents Moderation fluentd endpoint ैདྷͷϩάసૹ: ௚઀֨ೲύλʔϯ
  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͕ཷ·͍ͬͯͯ΋
 ू໿αʔό͸ͣͬͱ͍ΔͷͰ
 ϦτϥΠͰ͖Δ ☝
  9. ैདྷͷ՝୊఺ • ϝϯςφϯείετ • εέʔϧΞ΢τɾεέʔϧΠϯͷखؒɺ֦ுίετ • ू໿αʔό૿ݮ΍sink௥ՃͰDaemon/SidecarͷίϯϑΟάमਖ਼ɺ
 σϓϩΠ͕ൃੜ • ܽଛϦεΫ

    • όοϑΝૹΓ͖ͬͯͳ͍αʔόͷεέʔϧΠϯͳͲʹΑΔαʔϏεΞ΢τ • ઃఆΛؒҧ͑ΔͱɺόοϑΝᷓΕͳͲͰܽଛɺࣄނൃੜ
  10. Logging Challenges ϩάج൫ͷߏ੒ʹର͢Δཁ݅ͱ՝୊

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

  12. Challenge: ৴པੑ • ϚονϯάαʔϏεͷΑ͏ͳϩάཁ͕݅ݫ͍͠αʔϏεͰ͸ɺ
 ΄ͱΜͲͷϩάʹର͢Δཁ͕݅׬શʹܽଛͳ͠ • Contents moderation༻ͷϩά΍ΞΫηεϩάΛؚΉ • ALBͷΞΫηεϩά͚ͩͰ͸μϝͩͬͨΓ

    • ܽଛͨ͠ࡍͷϦτϥΠػߏɺյΕͨϩά͕ྲྀΕͨͱ͖ͷٹग़ϑϩʔ͕ඞཁ • fluentdͷίϯϑΟάͰ΋Ͱ͖Δ͕ɺίϯϑΟά͕RubyͩΒ͚ʹͳΓɺ
 ϝϯςφϯείετ૿Ճ
  13. Challenge: ϝϯςφϯείετ • Sidecar/Daemon fluentd (ͳͲͷϛυϧ΢ΣΞ) Λར༻͢Δͱɺ
 ͦΕΒͷ؅ཧɺϝϯςφϯε͕ඞཁ • ͞Βʹɺू໿ύλʔϯͰ͸ू໿αʔόͷ໘౗Λݟͳ͍ͱ͍͚ͳ͍

    • ͕ͦ͜μϝʹͳΔͱશ෦μϝ • σΟεΫɺࢮ׆؂ࢹɺfluentdόοϑΝঢ়ଶɺηΩϡϦςΟύον΍
 OSߋ৽ͳͲ
  14. Challenge: εέʔϥϏϦςΟ • ؆୯ʹεέʔϦϯάͰ͖ΔΑ͏ʹ͍ͨ͠ • ؆୯ = αʔόߏஙɺAnsibleྲྀ͠ΑΓ؆୯ • ϩάͷग़ྗ͕ஶ͘͠૿͑Δ͜ͱ͕૝ఆ͞Εͳ͍ͷͰɺ


    ΦʔτεέʔϦϯά͸ඞਢͰ͸ͳ͍ • σΟεΫ༰ྔ΍όοϑΝαΠζΑΓεϧʔϓοτϕʔεͰ
 ύϑΥʔϚϯεΛࢦఆ͍ͨ͠ • ͪ͜Βͷํ͕DevOps΍SRE͡Όͳ͍։ൃऀʹͱͬͯҰ൪Θ͔Γ΍͍͢
  15. Challenge: ֦ுੑ • ֨ೲઌ͕૿͑Ε͹ɺ҆қʹߦ͑ΔΑ͏ʹ͍ͨ͠ • ྫ: KibanaΛ࢖ͬͨϩάՄࢹԽΛಋೖ͍ͨ͠ • ҆қ: •

    ΞϓϦέʔγϣϯͷσϓϩΠͳ͠ • ΞʔΩςΫνϟมߋͳ͠
  16. Challenge: ൚༻ੑ • ͲͷΑ͏ͳαʔϏε΍ཁ݅ʹ΋ରԠͰ͖Δ • ࠶ݱੑ͕͋ΓɺಛఆͷαʔϏεɾཁ݅ʹґଘ͠ͳ͍ • χʔζʹ߹Θͤͯඍௐ੔Ͱ͖Δ • ࠶ར༻

    & ࣗ༝ʹ૊Έ߹Θ͕ͤՄೳ
  17. After *a lot* of 
 sleepless nights. . . ਺͖͑Εͳ͍຾Ε͵໷Λܦͯʜ

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

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


    εϧʔϓοτΛ૿΍͚ͨ͠Ε͹γϟʔυΛ૿΍͚ͩ͢ • reshard͕ࣗಈͰߦΘΕΔ
  20. ͳͥ Kinesis + Lambda • Kinesis + Lambda Event Source

    MappingͰ͸ɺϦτϥΠ͕ࣗಈ • Lambda͕ࣦഊ͢Ε͹ɺಉ͡σʔλͰ࠶࣮ߦ • ͦͷσʔλ͕ࣦޮ OR Lambdaͷ࣮ߦ͕੒ޭͰऴྃ͢Δ·ͰϦτϥΠ
 (ͲͪΒ͔ૣ͍ํ) • Kinesis্ͷσʔλΛͲ͜·Ͱॲཧ͔ͨ͠ͷϙδγϣϯ؅ཧ΋͞ΕΔ • ࣗલͰ༻ҙ͢Δ΋ͷ͸σʔλͷॲཧ΍సૹ༻ͷ࢓૊Έ͚ͩ! ָνϯ!
  21. ߏ੒ v1 • Kinesis Streams -> Lambda -> ֤छ sink

    (S3/ES/Internal BI etc.) • Kinesis΁ͷ֨ೲ͸αʔϏεͷཁ݅ʗঢ়ଶʹΑΔ • ૬৐Γfluentd + aws-fluent-plugin-kinesis • Kinesis APIͰΞϓϦέʔγϣϯͷίʔυ͔Β௚઀֨ೲ
  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
  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 ϩάͷอଘ
  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
  25. Logging Challenges ౴͑߹Θͤ 1. ৴པੑ: KinesisͰͷू໿ɺKinesis+LambdaͷϦτϥΠػߏ 2. ϝϯςφϯείετ: ServerlessɺFull-Managed 3.

    εέʔϥϏϦςΟ: Kinesisγϟʔυ௥ՃɺࣗಈϦγϟʔυ 4. ֦ுੑ: LambdaϞδϡʔϧΛ޷͖ʹ૊Έ߹ΘͤͰ͖Δ 5. ൚༻ੑ: ͲͷαʔϏεͷཁ๬ʹ΋ରԠͰ͖ΔLambdaϞδϡʔϧͷ։ൃ
  26. Feedback • ʮू໿༻fluentd͕ࣺͯΒΕͯؾ͍͍࣋ͪɺ࢒ͬͨ΋ͷ΋ࣺ͍ͯͨʯ • ʮfluent-plugin-kinesisʹཔΓͨ͘ͳ͍ʯ • ʮfluent-plugin-kinesisͷόοϑΝઃఆͳͲconfͷ؅ཧ͕ΊΜͲ͍ʯ • ʮKinesis APIΛୟ͘ύλʔϯͰɺfluentd૬౰ͷ࣮૷Λͨ͘͠ͳ͍ʯ

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

  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ར༻͢Ε͹࢖͑Δ
  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
  30. ஫ҙ: 
 CloudWatch LogsͷPutLogEvents͸ߴ͍ 
 (Kinesis΋...҆͘͸ͳ͍) ࡳଋ Ͱ৴པੑΛങ͍ͬͯΔΑ͏ͳ΋ͷ ͨͩɺྫ͑͹ECSͷϩΪϯάυϥΠόͰKinesis΁ͷ֨ೲ͕Ͱ͖ΔΑ͏ʹ ͳͬͨͱͯ͠΋ɺKinesisͷΩϟύ΍ϩάपΓLambdaͷෆ۩߹ͳͲ͔Β

    ϩάΛकΔͨΊͷόοΫΞοϓ͕ཉ͍͠
  31. About Baikonur OSS #BJLPOVS044ϓϩδΣΫτʹ͍ͭͯ

  32. Baikonur OSS Project • Terraform Module΍֤छπʔϧͷڞ௨ԽϓϩδΣΫτ • GitHub.comɺTerraform Module Registry

    • ฐࣾͰ։ൃɺར༻͍ͯ͠ΔϞδϡʔϧΛॱ࣍OSSԽ • ฐࣾ಺: AWSϞδϡʔϧ23छྨ • ໊લͷ༝དྷɿόΠίψʔϧӉ஦ج஍ • ͦͷ··࢖͑Δɺ͙͢ల։Ͱ͖ΔϕετϓϥΫςΟε
  33. Baikonur OSS modules • ຊ೔঺հͨ͠શͯͷLambda͸BaikonurͰ঺հ͞Ε͍ͯ·͢ • ָʹߏங͕Ͱ͖ΔTerraform Module΋ఏڙ • ฐࣾ಺Ͱ࢖͍ͬͯΔ΋ͷΛͦͷ··ެ։

  34. None
  35. None
  36. ൪֎: eden • ECS Dynamic Environment Manager = eden •

    ECSͷ։ൃ؀ڥΛಈతʹ࡞੒͢Δπʔϧ΋Baikonur OSSͰެ։ • ৄࡉ: http://bit.ly/awseden
  37. Kinesis Caveats ,JOFTJTΛར༻͢Δʹ͋ͨͬͯ஫ҙ͢΂͖ͱ͜Ζ

  38. Scaling • γϟʔυ਺มߋͰͰ͖ͳ͍͜ͱ (υΩϡϝϯςʔγϣϯ) : • 24࣌ؒͰ3ճҎ্ͷγϟʔυ਺มߋ • ݱࡏͷγϟʔυ਺ΑΓ2ഒΑΓଟ͍ɺ൒෼ΑΓগͳ͍γϟʔυ਺΁ͷมߋ •

    500γϟʔυΑΓଟ͍γϟʔυ਺΁ͷมߋ • 500γϟʔυΑΓଟ͍γϟʔυΛ࣋ͭετϦʔϜͷεέʔϧμ΢ϯෆՄ • ΞΧ΢ϯτ୯Ґͷγϟʔυ਺ͷ্ݶͷಥഁ • શ෦্ݶ؇࿨Մೳ
  39. Autoscaling • ΦʔτεέʔϦϯά͸ఏڙ͞Ε͍ͯͳ͍ • awslabs/amazon-kinesis-scaling-utils Λ࢖͑͹ΦʔτεέʔϦϯάͬΆ͍
 ͜ͱ͕Ͱ͖Δ • ࢲͷܦݧͰ͸ΦʔτεέʔϦϯά͕ඞཁʹͳͬͨ͜ͱ͸ͳ͍ •

    ॻ͖ࠐΈɺಡΈࠐΈࣦഊ਺ͷ؂ࢹΛ௥Ճ͠ɺ
 ҟৗݕ஌ΛτϦΨʔʹखಈͰγϟʔυ૿ՃͰ͖Ε͹े෼ • Capacity ExceededͰϦτϥΠ͢ΔϩδοΫ֤ॴͰ࣮૷ࡁΈ • ্هscaling-utilsΛPythonͰॻ͖௚ͯ͠কདྷతʹΦʔτεέʔϧ͢Δ͔΋
  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
  41. Conclusion ૯ׅ

  42. ૯ׅ • ؾܰʹ֦ுՄೳͳϩάपΓΞʔΩςΫνϟΛ࣮ݱ • KinesisͱLambdaͷ׆༻ͰServerlessߏ੒ • ϝϯςφϯείετݮ • Kinesis +

    Lambda࿈ܞͰࣗಈϦτϥΠ • ࣮૷Ͱ͸ϦτϥΠػߏΛ࣮૷͢Δඞཁ͕ͳ͘ɺΤϥʔॲཧͷΈͰे෼ • ڞ௨ԽɺOSSԽʹΑͬͯಋೖίετݮ
  43. Thank you for listening! ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠