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

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

    • όοϑΝૹΓ͖ͬͯͳ͍αʔόͷεέʔϧΠϯͳͲʹΑΔαʔϏεΞ΢τ • ઃఆΛؒҧ͑ΔͱɺόοϑΝᷓΕͳͲͰܽଛɺࣄނൃੜ
  5. Challenge: ৴པੑ • ϚονϯάαʔϏεͷΑ͏ͳϩάཁ͕݅ݫ͍͠αʔϏεͰ͸ɺ
 ΄ͱΜͲͷϩάʹର͢Δཁ͕݅׬શʹܽଛͳ͠ • Contents moderation༻ͷϩά΍ΞΫηεϩάΛؚΉ • ALBͷΞΫηεϩά͚ͩͰ͸μϝͩͬͨΓ

    • ܽଛͨ͠ࡍͷϦτϥΠػߏɺյΕͨϩά͕ྲྀΕͨͱ͖ͷٹग़ϑϩʔ͕ඞཁ • fluentdͷίϯϑΟάͰ΋Ͱ͖Δ͕ɺίϯϑΟά͕RubyͩΒ͚ʹͳΓɺ
 ϝϯςφϯείετ૿Ճ
  6. Challenge: εέʔϥϏϦςΟ • ؆୯ʹεέʔϦϯάͰ͖ΔΑ͏ʹ͍ͨ͠ • ؆୯ = αʔόߏஙɺAnsibleྲྀ͠ΑΓ؆୯ • ϩάͷग़ྗ͕ஶ͘͠૿͑Δ͜ͱ͕૝ఆ͞Εͳ͍ͷͰɺ


    ΦʔτεέʔϦϯά͸ඞਢͰ͸ͳ͍ • σΟεΫ༰ྔ΍όοϑΝαΠζΑΓεϧʔϓοτϕʔεͰ
 ύϑΥʔϚϯεΛࢦఆ͍ͨ͠ • ͪ͜Βͷํ͕DevOps΍SRE͡Όͳ͍։ൃऀʹͱͬͯҰ൪Θ͔Γ΍͍͢
  7. ͳͥ Kinesis + Lambda • Kinesis + Lambda Event Source

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

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

    εέʔϥϏϦςΟ: Kinesisγϟʔυ௥ՃɺࣗಈϦγϟʔυ 4. ֦ுੑ: LambdaϞδϡʔϧΛ޷͖ʹ૊Έ߹ΘͤͰ͖Δ 5. ൚༻ੑ: ͲͷαʔϏεͷཁ๬ʹ΋ରԠͰ͖ΔLambdaϞδϡʔϧͷ։ൃ
  13. 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ར༻͢Ε͹࢖͑Δ
  14. ࣄྫ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
  15. Baikonur OSS Project • Terraform Module΍֤छπʔϧͷڞ௨ԽϓϩδΣΫτ • GitHub.comɺTerraform Module Registry

    • ฐࣾͰ։ൃɺར༻͍ͯ͠ΔϞδϡʔϧΛॱ࣍OSSԽ • ฐࣾ಺: AWSϞδϡʔϧ23छྨ • ໊લͷ༝དྷɿόΠίψʔϧӉ஦ج஍ • ͦͷ··࢖͑Δɺ͙͢ల։Ͱ͖ΔϕετϓϥΫςΟε
  16. ൪֎: eden • ECS Dynamic Environment Manager = eden •

    ECSͷ։ൃ؀ڥΛಈతʹ࡞੒͢Δπʔϧ΋Baikonur OSSͰެ։ • ৄࡉ: http://bit.ly/awseden
  17. Scaling • γϟʔυ਺มߋͰͰ͖ͳ͍͜ͱ (υΩϡϝϯςʔγϣϯ) : • 24࣌ؒͰ3ճҎ্ͷγϟʔυ਺มߋ • ݱࡏͷγϟʔυ਺ΑΓ2ഒΑΓଟ͍ɺ൒෼ΑΓগͳ͍γϟʔυ਺΁ͷมߋ •

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

    ॻ͖ࠐΈɺಡΈࠐΈࣦഊ਺ͷ؂ࢹΛ௥Ճ͠ɺ
 ҟৗݕ஌ΛτϦΨʔʹखಈͰγϟʔυ૿ՃͰ͖Ε͹े෼ • Capacity ExceededͰϦτϥΠ͢ΔϩδοΫ֤ॴͰ࣮૷ࡁΈ • ্هscaling-utilsΛPythonͰॻ͖௚ͯ͠কདྷతʹΦʔτεέʔϧ͢Δ͔΋
  19. 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
  20. ૯ׅ • ؾܰʹ֦ுՄೳͳϩάपΓΞʔΩςΫνϟΛ࣮ݱ • KinesisͱLambdaͷ׆༻ͰServerlessߏ੒ • ϝϯςφϯείετݮ • Kinesis +

    Lambda࿈ܞͰࣗಈϦτϥΠ • ࣮૷Ͱ͸ϦτϥΠػߏΛ࣮૷͢Δඞཁ͕ͳ͘ɺΤϥʔॲཧͷΈͰे෼ • ڞ௨ԽɺOSSԽʹΑͬͯಋೖίετݮ