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

NIFTY Tech Talkコラボ 安定稼働するポータルサイトの作り方

NIFTY Tech Talkコラボ 安定稼働するポータルサイトの作り方

ニフティ株式会社

April 28, 2023
Tweet

More Decks by ニフティ株式会社

Other Decks in Programming

Transcript

  1. Copyright © NIFTY Corporation All Rights Reserved.

    安定稼働するポータルサイトの作り方
    渡邊 大介
    会員システムグループ 第一開発チーム

    View Slide

  2. Copyright © NIFTY Corporation All Rights Reserved.

    渡邊 大介


    入社   2019年4月(5年目)


    担当業務 自社WEBサービスの運用開発


    趣味   映画、ドライブ、バドミントン

    自己紹介


    View Slide

  3. Copyright © NIFTY Corporation All Rights Reserved.

    ニフティトップページについて



    1

    安定稼働するための工夫

    2

    キャッシュをほとんど効かせられない状況下での負荷軽減方法

    3


    View Slide

  4. Copyright © NIFTY Corporation All Rights Reserved.

    ニフティトップページについて



    01


    View Slide

  5. Copyright © NIFTY Corporation All Rights Reserved.

    ニフティトップページ

    PC
    (2022/07/05にフロントエンドを刷新)
    スマホ テキスト

    View Slide

  6. Copyright © NIFTY Corporation All Rights Reserved.

    ニフティトップページ

    ● 20世紀から存在する月間3,000万PVのポータルサイト
    ● 多くのコンテンツを展開している
    ○ 接続会員向け(宝箱、ニフくじ、メール、ニフティ
    ポイントクラブ)
    ○ その他(ニュース、検索、天気、占いなど)
    ● ユーザーが日常的に使うサービスのため、安定稼働は
    必須

    View Slide

  7. Copyright © NIFTY Corporation All Rights Reserved.

    ニフティトップページ(PC)の環境

    ● AWS Lambdaを使ったサーバーレス構成
    ● Terraformによるインフラ管理
    ● フロントエンドにNext.js,TypeScriptを採用
    ● バックエンドにGo言語を採用
    ● GitHubによるコード管理、自動テスト・デプロイ

    View Slide

  8. Copyright © NIFTY Corporation All Rights Reserved.

    安定稼働するための工夫



    02


    View Slide

  9. Copyright © NIFTY Corporation All Rights Reserved.

    安定稼働するための工夫(インフラ)

    ● APIの管理にはTerraformを採用
    ● コード管理することで変更の追跡やバージョン管理が容易になる
    ● 構文チェックや現在の状態と変更点を比較する機能がデフォルト
    で搭載
    ● アプリケーションのデプロイにServerless Frameworkを採用

    View Slide

  10. Copyright © NIFTY Corporation All Rights Reserved.

    安定稼働するための工夫(インフラ)

    ● Lambdaで動くため自動でスケールが可能
    ● サーバー作業が不要になり、アプリケーション開発に専念するこ
    とが可能に
    ● 本番環境以外の環境整備
    ○ 開発環境
    ○ ステージング環境
    ○ 障害対応を擬似的に行うロールプレイング環境

    View Slide

  11. Copyright © NIFTY Corporation All Rights Reserved.

    安定稼働するための工夫(デプロイ)

    各ブランチと各環境の対応付けを実施

    開発環境#1
    featureブランチ developブランチ
    本番環境
    masterブランチ
    PR#1

    開発環境#2
    ラベル付与
    ラベル付与
    ステージング環境
    マージ時
    PR#2

    PR#3

    マージ時
    施策A
    施策B
    開発環境#1
    ラベル付与
    PR#4

    施策C
    releaseブランチ

    View Slide

  12. Copyright © NIFTY Corporation All Rights Reserved.

    安定稼働するための工夫(GitHub)

    ● pre-commitを導入し、commitの段階でフォーマット
    や構文チェックを実行
    ● GitHub Actionsを使ってPRを出したタイミングでイ
    ンフラの変更確認や単体テストを実行するワークフ
    ローを整備
    ● デプロイはすべてGitHubで行う
    ○ リリースで問題が発生したらGitHubからリバート

    View Slide

  13. Copyright © NIFTY Corporation All Rights Reserved.

    安定稼働するための工夫(GitHub)

    ● リリース状況を自動生成するワークフロー
    ● リリース前のチェック項目を自動で投稿するワークフロー

    View Slide

  14. Copyright © NIFTY Corporation All Rights Reserved.

    ● TypeScriptを採用し、型安全性とメンテナンス性の向上
    ● 単体テストを追加し、機能の動作保証
    ● 開発ルール
    ○ データ取得処理はデータ層に分離
    ○ コンポーネントとロジックを分離(カスタムフック化)
    ○ エラーログ出力
    安定稼働するための工夫(アプリケーション)


    View Slide

  15. Copyright © NIFTY Corporation All Rights Reserved.

    安定稼働するための工夫(エラー通知)

    ● 設定したしきい値を超えたエラーが発生した場合にはSlack、メールに通知を送る仕組みを構築
    ● 現在、約300個のアラートが設定されている
    ○ エラーログはすべてCloudWatch Logsに出力するように設定

    View Slide

  16. Copyright © NIFTY Corporation All Rights Reserved.

    キャッシュをほとんど効かせられない状況下での負荷
    軽減方法



    03


    View Slide

  17. Copyright © NIFTY Corporation All Rights Reserved.

    自社サービスの情報を表示する機能

    ● ポータルサイトという性質上、自社サービスの情報を表示する機能が多く存在する
    ● リリースする上での課題
    ○ 速報性の高いサービス(ニュース、地震情報など)を提供しているため、長めの
    キャッシュを効かせることが困難
    ○ ほかサービスへの負荷を最低限に抑えなければいけない

    View Slide

  18. Copyright © NIFTY Corporation All Rights Reserved.

    実装内容

    ● APIを定期的に叩くLambda(Go言語)を作成し、結果をS3に
    出力する仕組みを構築
    ● フロントエンド側はS3からデータを取得する

    View Slide

  19. Copyright © NIFTY Corporation All Rights Reserved.

    今後

    ● リリース後チェックの負担を軽減するためにE2Eテストの導入
    ● 対応が必要なアラートだけに集中できるようにアラートの調整

    View Slide

  20. Copyright © NIFTY Corporation All Rights Reserved.

    まとめ

    ● サーバレスを活用して運用負荷の軽減
    ● 機械的にチェックできるところは積極的に自動化する
    ● 可用性の高いサービスを活用して負荷軽減する

    View Slide