every Tech Blog

株式会社エブリーのTech Blogです。

API を本番のデータにつなぎながら確認できるステージング環境を作成しました

はじめに

こんにちは!トモニテにて開発を行っている吉田です。

今回は API を本番のデータにつなぎながら確認できるようステージング環境を作成したのでそのことについて書いていきます!

目的

本番環境へのリリース前には、さまざまなケースを考慮したテストを行うことが不可欠です。しかし、開発環境で考えられる限りのケースを網羅しても、どうしても考慮漏れが発生することがあります。このようなリスクを軽減するために本番環境を利用したステージング環境を構築しました。

これにより、実際のデータを使用しながら運用時を想定したテストを行うことが可能になりリリース前に潜在的な問題を早期に発見し、サービスの品質を向上が期待できます。

ステージング環境の作成

現在のトモニテのインフラ構成は簡単に図に起こすと下記のようになっています。

今回は ECS を新たに作成しリスナールールを追加することでステージング環境の構築を実現をします。 図だと赤枠で囲っているところが新たな構成になるイメージ(下図)です。

ステージング環境の作成でのゴールは以下のように設定しました。

  • エンドポイントを叩いて動作確認ができる
  • 開発ブランチへのマージをトリガーにステージング環境のサーバーにもデプロイ

エンドポイントを叩いて ステージング できるようにする

弊社ではインフラの管理に terraform を利用しています。以下は、AWS インフラを terraform を用いて構築するためのリソース定義のサンプルです。
(各リソースについて一部省略しています)

1.タスク定義

resource "aws_ecs_task_definition" "stg_server" {
  family                   = "stg-server"
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = 256
  memory                   = 512
  execution_role_arn       = <タスク実行のARN>
  task_role_arn            = <IAMロールのARN> // 他のAWSサービスを呼び出すため
  container_definitions = jsonencode(
    [
      {
        command = [...]
        cpu = 0 // 指定がなければ自動で割り当てられる
        environment = [...]
        essential = true // タスク内のいずれかのコンテナが停止したときにすべてのコンテナを停止するか
        image     = <ecrのイメージを指定>
        logConfiguration = {
          logDriver = "awslogs"
          options = {
            awslogs-create-group  = "true"
            awslogs-group         = "stg-server"
            awslogs-region        = <region指定>
            awslogs-stream-prefix = "ecs"
          }
        }
        mountPoints = []
        name        = "stg-server"
        portMappings = [
          {
            containerPort = 1323
            hostPort      = 1323
            protocol      = "tcp"
          },
        ]
        secrets = [...]
        volumesFrom = []
      },
  ])
  runtime_platform {
    cpu_architecture        = "X86_64"
    operating_system_family = "LINUX"
  }
}

2.ターゲットグループ

resource "aws_lb_target_group" "stg_server_target" {
  name                 = "stg_server_target"
  port                 = 1323
  target_type          = "ip"
  protocol             = "HTTP"
  vpc_id               = <VPCのID>
  deregistration_delay = <ドレインするまでに待機する時間>

  health_check {
    path                = "/healthcheck"
    interval            = 30
    timeout             = 5
    healthy_threshold   = 5
    unhealthy_threshold = 2
  }
}

3.クラスター

resource "aws_ecs_cluster" "stg_ecs_cluster" {
  name = "stg_ecs_cluster"
}

4.サービス

resource "aws_ecs_service" "stg_server" {
  name                               = "stg-server"
  cluster                            = aws_ecs_cluster.stg_ecs_cluster.arn
  task_definition                    = "stg-server"
  desired_count                      = 1
  deployment_maximum_percent         = 200
  deployment_minimum_healthy_percent = 100
  launch_type                        = "FARGATE"
  enable_execute_command             = true

  load_balancer {
    target_group_arn = aws_lb_target_group.stg_server_target.arn
    container_name   = "stg-server"
    container_port   = 1323
  }

  network_configuration {
    subnets          = <subnet指定>
    security_groups  = <セキュリティグループ指定>
    assign_public_ip = true
  }

  lifecycle {
    ignore_changes = [task_definition]
  }
}

5.ロードバランサー

resource "aws_alb_listener_rule" "stg_server_rule" {
  listener_arn = <登録するリスナーリソース>.arn
  priority     = <優先度>

  action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.stg_server_target.arn
  }

  condition {
    host_header {
      values = [<マッチするホストヘッダーパターン>]
    }
  }
}

6.Route53 レコード

resource "aws_route53_record" "stg_server" {
  name     = <レコード名>
  records  = <ELBのDNS名>
  ttl      = "300"
  type     = "CNAME"
  zone_id  = <ホストゾーンのID>

  weighted_routing_policy {
    weight = 100
  }
}

7.ECR のライフサイクルポリシー

resource "aws_ecr_lifecycle_policy" "stg-server-lifecycle_policy" {
  repository = <stg環境用のECRリポジトリ>.name

  policy = <<EOF
{
  "rules": [
    {
      "rulePriority": 1,
      "description": "最新の1イメージを残す",
      "selection": { // 今回はタグによる指定
        "tagStatus": "tagged",
        "tagPrefixList": ["stg"],
        "countType": "imageCountMoreThan",
        "countNumber": 1
      },
      "action": {
        "type": "expire"
      }
    }
  ]
}
EOF
}

上記の構成を既存リソースに加えることで新規に作成した API についてエンドポイントを叩いて動作確認することができるようになりました。
※今回は認証について言及していませんが別途認証の設定等も必要になります。

注意点

  • ALB やホストゾーンなど既存のリソースを利用しているものについては記述を省略しています。
  • <...>で囲まれた部分は、実際の値に置き換えてください。
  • 各リソースの設定は、具体的な要件や環境に応じて調整が必要です。
  • Terraform のバージョンや AWS プロバイダーのバージョンによって、リソースの属性や構文が異なる場合がありますので、公式ドキュメントを参照してください。

開発環境へのデプロイをフックにステージング環境のサーバーにもデプロイ

トモニテでは、開発プロセスの効率化と品質向上を目指し、ビルドに AWS CodeBuild を利用しています。ステージング環境のサーバーへのデプロイは、開発ブランチへのマージをトリガーとして自動的に行う仕組みを構築しました。 これにより、開発者はコードをマージするだけで、ステージング環境に最新のビルドをデプロイすることができます。

以下は、AWS CodeBuild で使用する buildspec.yml の設定です。このファイルは、ビルドプロセスの各フェーズで実行されるコマンドを定義しています。

version: 0.2

env:
  variables:
    REPOSITORY_URI_BASE: <REPOSITORY_URI_BASE>
    DOCKER_BUILDKIT: "1"

phases:
  install:
    commands:
      - GO_VERSION=$(cat .go-version) # Go のバージョンを取得
      - REPOSITORY_URI=${AWS_ACCOUNT_ID}${REPOSITORY_URI_BASE}stg-server # Docker イメージのリポジトリ URI を設定
      - TAG=stg
      - | # ecs-deploy ツールをダウンロードし実行可能にする
        echo "Setup ecs-deploy"
        curl -sL https://github.com/silinternational/ecs-deploy/archive/3.10.7.tar.gz | tar zxvf -
        mv ecs-deploy-3.10.7 ecs-deploy
        chmod +x ecs-deploy/ecs-deploy
  pre_build:
    commands:
      - docker login -u <USER_NAME> -p ${DOCKER_HUB_PASS} # Docker Hub にログイン
      - DATE=`date +%s` # 現在の日時を取得(イメージのタグに使用)
  build:
    commands: # Docker イメージをビルドしタグ付け
      - echo Building the Docker image...
      - docker build -f ./Dockerfile --build-arg GO_VERSION=$GO_VERSION -t $REPOSITORY_URI:$TAG .
      - docker tag $REPOSITORY_URI:${TAG} "${REPOSITORY_URI}:${TAG}.${DATE}"
  post_build:
    commands:
      - echo Logging in to Amazon ECR ...
      - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}${REPOSITORY_URI_BASE # Amazon ECR にログイン
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:$TAG # ビルドした Docker イメージをプッシュ
      - docker push "${REPOSITORY_URI}:${TAG}.${DATE}"
      - | # ECS クラスターに新しいタスクをデプロイ
        echo "deploy start"
        ecs-deploy/ecs-deploy --cluster <CLUSTER_NAME> \
                              --task-definition-file <タスク定義>.json \
                              --service-name <SERVICE_NAME> \
                              --region <region指定> \
                              --timeout 600 \
                              --image ${AWS_ACCOUNT_ID}.${REPOSITORY_URI_BASE}/<FAMLIY>:${TAG}

cache:
  paths:
    - $GOPATH

まとめ

今回の記事では、ステージング環境の構築について説明しました。本番データに接続し実際の運用を想定したテストを行うことで、リリース前に潜在的な問題を早期に発見し、サービスの品質を向上させることを目的としています。 ステージング環境の作成により考慮漏れによるリスクを軽減できたと考えています。 一方、この環境は比較的ライトに構築したため、さらなる改良の余地があると考えています。今回作成したものをゴールとせず、より良い構成になるよう今後も改善を重ねていきたいと思います!

Cloud SQL for MySQL 5.7 から 8.0 移行計画

Cloud SQL for MySQL 5.7 から 8.0 移行計画

はじめに

こんにちは、TIMELINE 開発部 Service Development をしているほんだです!
つい最近 Aurora MySQL バージョン 3 対応したな...。というのはさておき。
今回は Cloud SQL for MySQL のデータベースバージョンを 5.7 から 8.0 に移行する際に行った方法について紹介します!

前提

皆さんご存知かと思いますが、2025年2月1日からCloud SQLではMySQL 5.7, 5.6の拡張サポートが開始し、2028年2月1日はサポートが終了します。そこでTIMELINE が提供しているサービスの一つで、Cloud SQL for MySQL 5.7を使用しているため8.0への移行を行うことになりました。
今回のシステムでは月に1回程度メンテナンスでサービスが停止するため、そのタイミングでインプレイスアップグレードを行うことにしました。以下では5.7から8.0へ移行する際の事前準備、インプレイスアップグレードの手順、切り戻し方法について説明します。

事前準備

5.7と8.0の差分を確認

MySQLの公式を参考に8.0での差分を確認しました。
今回はデフォルト認証プラグインがcaching_sha2_password, character_set_serverのデフォルト値がutf8mb4に変わったことやcollation_serverのデフォルト値がutf8mb4_0900_ai_ciに変更されたことが差分として上がりました。

Cloud SQLの設定の確認

Cloud SQLはデータベースフラグというものを用いてMySQLパラメータの調整を行っているので、その確認も必要です。データベースフラグのデフォルトやどの値が設定できるかはこちらのサイトで確認ができます。
今回のデータベースでは上述5.7と8.0の差分で上がったdefault_authentication_plugin, character_set_servercollation_serverをデータベースフラグを用いて設定することになりました。

手順

手順は下記の通りになります。

順番 手順
1 インスタンスのクローン
2 インプレイスアップグレード
3 MySQL versionの確認
4 データベースフラグの設定

ここからは実際に実行するコマンドも踏まえて説明していきます。

1. インスタンスのクローン

インプレイスアップグレードを実行する際に、バックアップが作成されますが、こちらはあくまでデータのみのため別途手動でインスタンスのクローンを行います。 Cloud SQLインスタンスの名前は変更することはできないので、アップグレードに失敗した際に切り替えて問題ない名前にしとく事をお勧めします。

$ gcloud sql instances clone <SOURCE_INSTANCE_NAME> <DESTINATION_INSTANCE_NAME> --project=<PROJECT_ID>

2. インプレイスアップグレード

下記コマンドを用いて既存のインスタンスに対してインプレイスアップグレードを実行します。上述のように、インプレイスアップグレード開始時と終了時にデータのバックアップが作成されます。
今回は8.0.33にアップグレードするためdatabase-versionMYSQL_8_0_33を指定します。

$ gcloud sql instances patch <INSTANCE_NAME> --database-version=MYSQL_8_0_33

インスタンスのバックアップについては下記コマンドで確認することができます。

$ gcloud sql backups list --instance=<INSTANCE_NAME>

インスタンスのアップグレード状況は下記コマンドで確認することができます。

$ gcloud sql operations list --instance=<INSTANCE_NAME>

$ gcloud sql operations describe OPERATION

3. MySQL versionの確認

Cloud SQL Auth Proxyを用いてCloud SQLに接続しMySQLのversionを確認します。8.0系になっていることが確認できたらOKです。

$ cloud-sql-proxy --port <PORT_NUMBER> <INSTANCE_CONNECTION_NAME>

$ mysql -u <USER_NAME> 127.0.0.1 -P <PORT_NUMBER> -p

mysql> select version();

4. データベースフラグの設定

上述の通り、MySQLのdefault設定と異なる部分があるので、Cloud SQLのデータベースフラグを更新を行います。

$ gcloud sql instances describe <INSTANCE_NAME>

$ gcloud sql instances patch <INSTANCE_NAME> --database-flags=character_set_server=utf8,collation_server=utf8_general_ci,default_authentication_plugin=mysql_native_password

下記コマンドにてデータベースフラグが更新されていることを確認します。

$ gcloud sql instances describe <INSTANCE_NAME>

念の為インスタンスに接続しMySQL commandでも確認すると良いです。

mysql> show variables like '%char%';

切り戻し方法

インスタンス名が変わっていることに注意して、手順1. で作成した既存のインスタンのクローンにそれぞれのサーバーの向き先を変更します。

まとめ

以前Aurora3への移行を行った際はconsoleベースで、アップグレードを行ったのですが今回gcloud commandを用いて行うことで、以前rymiyamotoの記事でもあった通りメンテナンスの再現性や、レビューが格段に容易になったと感じました。
また、今回の手順に記したものを実際の値に変えた手順書を作成しているため、当日はコピペするだけで作業が完了するので実行者の負荷やヒューマンエラーも軽減することができました!(筆者はタイポが多いです)
今回Cloud SQLのアップグレードを行うにあたって、明確な原因は追求できていませんがsidecar containerとして実行している、Cloud SQL Auth Proxyのimage versionが古すぎて、インスタンスに接続できないという事象が発生したので、定期的にメンテナンスを行うことは大切だと実感しました。
Cloud SQL for MySQLのインプレイスアップグレードを行おうとしてる人や今後本システムの開発に携わる人の参考になれば幸いです。

リテールハブ開発部の新設とDELISHKITCHEN開発部長の交代

タイトル - リテールハブ開発部の新設とDELISHKITCHEN開発部長の交代

はじめに

皆さん、いつもお世話になっております。CTO/開発本部の今井です。 本ブログでは、あたらくリテールハブ開発部を立ち上げたことおよび自分が兼務で務めていたDELISHKITCHEN開発部長の交代についてお話させていただきます。

リテールハブ開発部の設立

このたび、10/1でリテールハブ開発部を新設し、そこの開発部長を私が務めることになりました。
リテールハブ開発部は、これまでDELISHKITCHEN開発部で手掛けてきた小売向けのサービス開発に注力をする新しい部門となります。
先んじて、ビジネス側はすでにリテールハブカンパニーとして切り出されていたところに合わせて、開発部も切り出すことを決断しました。
私たちの会社は、これまで多岐にわたる分野でサービスを提供してきましたが、小売業界は特に大きな成長が期待される分野の一つです。
お客様のニーズが日々変化する中で、より迅速で柔軟な対応が求められるようになりました。
そこで小売業界向けのサービス開発にさらに集中し、その分野におけるリーダーシップを強化するため、リテールハブ開発部を新たに立ち上げました。

組織図

この新しい部門では、既存の「ストアDX」「ネットスーパー」「小売アプリ」の開発を推進し、 『retail HUB』として統合ソリューションの提供を行うとともに、リテールメディアの構築を行っていくことに注力します。
私自身も、これまで培ってきた経験を最大限に活かし、チームと共により良いサービスを提供していけるよう努力していきたいと思っています。

新任DELISHKITCHEN開発部長の紹介

私がこれまで担当してきたDELISHKITCHEN開発部の新しい部長には、村上が就任します。
村上は、新卒で弊社に入社して以来、驚異的なスピードで成長を遂げてきた期待のエンジニアです。
彼の優れた技術力とリーダーシップは、すでに多くのプロジェクトで発揮されており、私たちのチームにとってなくてはならない存在です。
短期間で当時MAMADAYS開発部(現在のトモニテ開発部)のサーバーサイドのマネージャーに就任したのちに、DELISHKITCHEN開発部の副部長として主に広告商品の開発を一手に引き受けるなど大きな役割を果たしてきました。
彼の強みは、単なる技術力だけでなく、チームを引っ張るリーダーシップと、メンバーの意見を尊重しながらも、全体の方向性を見極めて決断する判断力にあります。
DELISHKITCHEN開発部は、新たなリーダーのもとで、さらに力強いチームへと進化していってくれると確信しています。
開発部長を彼に引き継げることは、私自身とても嬉しく思っています。

DELISHKITCHEN開発部の今後

今後村上が率いることになるDELISHKICHEN開発部は、これからも私たちの会社にとって軸となるサービスを運営・発展させるという重要な役割を担い続けます。 特に、小売向けのサービス開発をリテールハブ開発部に引き継いだことで、AIの活用をはじめとし、よりチャレンジングな領域でのイノベーションを生み出すことが期待されています。
村上のリーダーシップのもと、DELISHKITCHEN開発部は新たな成長を遂げ、多くのお客様に価値あるサービスを提供していけるよう邁進していきます。

また、組織は別れたものの、DELISHKITCHENとリテールハブは、それぞれの開発部が独立しているわけではなく、 システム連携や、リソースの共有や協力を行うことでより良いサービスを提供することができると考えています。
両部門の緊密な連携により、相乗効果を生み出し、「食」の領域をリードしていくことを目指していきます。

最後に

今回の新しい開発部の設立および部長交代を通じて、私自身も新たなステージで挑戦を続けていく決意を新たにしています。
リテールハブ開発部での取り組みを通じて、小売業界に革新をもたらし、より多くのお客様に価値あるサービスを届けていけるよう尽力していきます!

また、どちらの部門も進めたいことが増えていく中で、一緒に取り組んでいける仲間がまだまだ足りません!
ぜひ一緒に日本の「食」の領域をリードするサービスを作っていきましょう!

corp.every.tv

満たしたい状態の定義から始めるシステムDD

はじめに

こんにちは。DELISH KITCHEN 開発部 RHRA グループ所属の池です。

2024年6月、エブリーは5つの小売アプリの運営について事業譲渡を受け、『 retail HUB 』へ移管しました。

prtimes.jp

この事業譲渡において、私はシステムに関するデューデリジェンス(以下、システムDD)を担当しました。

今回 retail HUB へ移管したシステムは具体的には 5つプロダクトそれぞれにおける、iOS/Androidのネイティブアプリと、入稿管理画面の Web アプリケーションサーバー、アプリ向け API サーバー、それらを構成するシステム(AWS環境、ロードバランサー、データベース、バッチサーバーなど)です。

システムDDは譲渡されるIT資産の把握やリスクの確認を行う重要なプロセスですが、方法や手順が明確に決まっているようなものではなく、どう進めるべきか迷うことが多くありました。 そこで、本記事では、今回私が行ったシステムDDの具体的な手順の実例について紹介します。進め方に明確な正解のないシステムDDについて、手順の実例を共有することで、同様のプロセスを進める方々の参考になれば幸いです。

システムデューデリジェンスとは

システムデューデリジェンスとは、事業譲渡やM&Aの際に、譲渡対象となるシステムやIT資産の現状を詳細に調査し、リスクを特定するプロセスです。主に、譲渡後に予期しない障害やコストの増加を防ぐために実施されます。

システムDDの手順実例

私が行ったシステムDDの手順を振り返ると、以下の手順に整理できました。

  • 事前準備
    • 前提・目的の認識合わせ
    • 調査範囲の明確化
  • 調査
    • システムの満たしたい状態の定義
    • ドキュメントの満たしたい状態の定義
    • システム評価
      • 調査項目の洗い出しとグルーピング
        • アプリケーション(iOS/Android/サーバー)
        • インフラストラクチャ(AWS)
    • 現場エンジニアへのヒアリング
  • 調査後
    • 見つかった課題・リスクにおける対応の整理

ここからはそれぞれの手順について詳細を紹介します。

事前準備

前提・目的の認識合わせ

システムDDを進めるにあたり、まず最初に取り組んだことは事業譲渡における前提や目的の認識合わせです。

システムDDは社内でも初めても取り組みでもあることに加え、デューデリジェンスは実際にはその時の事業状況や、事業譲渡の目的などによって具体的な調査範囲・内容は変わり得るため、認識を合わせる必要があると考えました。認識合わせは当たり前なことですが忘れてはいけない大切な作業だと考えています。

今回の場合、事業譲渡がプロダクト単位で複数のプロダクトが譲渡対象であることや、各プロダクトの所有権や権利等の状況が異なる状況であること、のようなことが前提となります。

そして、主な目的は、譲渡対象となるIT資産の現状を把握し重大なリスクを特定することです。特に、譲渡後の運用が想定通りの工数で行えるか、また運用に影響を与える潜在的な課題やリスクを洗い出すことが重要でした。さらに、前提を踏まえると譲渡対象のソフトウェア資産を特定することも大事な目的になります。

調査範囲の明確化

以上の前提と目的を踏まえ、以下の点が重要となります。

  • プロダクト固有のリスクの評価
  • 運用に要する工数の把握、および運用に影響するリスクの特定
  • 譲渡対象のソフトウェア資産の洗い出しと特定

これらの点を踏まえて調査範囲を明確化し、システムDDを行いました。

調査

ここからは具体的に行った調査方法について紹介します。

システムの満たしたい状態の定義

運用保守への影響確認という前提の観点を踏まえて、譲渡後にエブリーが運用保守していくあたり、困難なく開発・保守・運用できるかどうかという観点で、システムの満たしたい理想状態を定義し、その状態との差分を確認していくことで調査および評価を行いました。

例えば、「バグ検知」という調査の大項目については以下のように定義しました。

  • エラー検知の仕組みが導入されていてバグやシステム異常の発生が即時に検知・通知されること
  • 各システムの各種メトリクス監視
  • アプリのクラッシュ計測

など...

このような定義との差分をドキュメントや、実際のソースコードおよびシステム構成の確認、現場エンジニアへのヒアリングなどを通して確認していきました。 また、満たしたい状態を定義することで、調査の際に確認すべきポイントが明確になります。

システム状態定義のイメージ

ドキュメントの満たしたい状態の定義

システムの状態定義と同様に、ドキュメントについても運用保守という観点を踏まえて期待する状態を定義し、その状態との差分を確認していくことで調査および評価を行いました。

例えば、「DB設計書・ER図」というドキュメントについては以下のように定義しました。

  • 下記の内容を把握でき、結果としてDBの運用・改修が可能な状態
    • 各物理データベース
      • 用途
      • スペック
      • DBMS ソフトウェアバージョン
      • 各種メトリクスの閲覧方法
      • 異常時の検知手法・対応手法
    • 各論理データベース
      • 各テーブルの構成、ER 図
      • 各テーブルやビュー・ストアド等の用途
      • 各テーブルやビュー内のカラムの定義

以下のようなドキュメントについて、同様の状態定義を行い、評価していきました。

  • 外部システム連携仕様書
  • 機能一覧
  • 要件定義署
  • 機能仕様書
  • API設計書
  • DB設計書・ER図
  • ログ設計書
  • 各種アカウント情報
  • 環境構築手順書
  • リリース手順書
  • 管理画面操作手順書
  • 画面一覧・画面遷移図
  • デザイン
  • バッチ処理概要
  • レポート作成マニュアル

など...

ドキュメント状態定義のイメージ

システム評価

システム評価では、上記の満たしたい状態を踏まえつつ、調査項目を洗い出してグルーピング行い、それぞれの調査項目についてGitHubやAWS環境などに招待いただいて閲覧操作することで評価を行いました。

アプリケーション(iOS/Android/サーバーなど)

アプリケーションの評価は、以下のグルーピング項目に基づいておよそ40項目ほどの調査項目を確認していきました。 確認対象のリポジトリは約30個ほどあり、膨大な作業量であったため、現場エンジニアへのヒアリングを交えながら効率的に調査を進めました。

評価のグルーピング項目

  • ソースコード品質
  • 設計
  • プロセス
  • セキュリティ
  • パフォーマンス
  • 構成要素

具体的な調査項目(一部抜粋)

  • ソースコード品質
    • コードベースの長さ
    • コードベースの複雑さ
    • テストコードのカバレッジ
    • エラーハンドリング
    • 適切なコメントの有無
    • 一定期間内のエラー件数
    • 既知の不具合の数
    • コーディング規約の有無
    • 言語/FW/ライブラリのバージョン

など...

可能であれば、全てのソースコードを実際に動作させて運用保守への影響を確認することが望ましいです。

アプリケーション評価項目のイメージ

インフラストラクチャ(AWS)

インフラストラクチャの評価は、AWS環境に関する以下のグルーピング項目に基づいて行いました。AWSアカウントに招待していただき、各項目に沿って確認しました。 アプリケーション評価と同様、現場エンジニアへのヒアリングを交えながら調査を進めました。

評価のグルーピング項目

  • アーキテクチャ設計
  • セキュリティ
  • コスト管理
  • 運用・保守

具体的な調査項目(一部抜粋)

  • アーキテクチャ設計
    • VPC設計
    • ネットワーク構成
    • データベース設計
    • コンテナ化の有無
    • IaCの有無
    • CI/CD構成
    • ログ収集とモニタリング
  • セキュリティ
    • IAMポリシーとロールの設定
    • セキュリティグループとネットワークACLの設定
    • データの暗号化
    • ログ管理と監視

現場エンジニアへのヒアリング

上述の調査での不明点や把握しきれない点について、現場エンジニアの方々からヒアリングを行いました。 現場のエンジニアの方々は、システムの現状をよく理解しているため、ヒアリングを通して価値のある情報を多く早く得ることができます。 ヒアリングは必須の作業として行うと望ましいです。できればシステムDDの早い段階で行い、かつ定期的に行うことで効率的に調査を進めることができると思います。

見つかった課題・リスクにおける対応の整理

以上の調査を行った結果、見つかった課題・リスクを一覧化し、それぞれに対して影響範囲を整理しました。 その内容をもとに先方と対応方針について協議を行いました。

やっておけばよかったこと

譲渡後に運用保守を始めから振り返ってみて、システムDDでいくつかやっておけばよかったと感じたことがありました。主に運用してみて想定外の工数に繋がったものです。

  • システムの移管作業を想定した調査観点の追加
  • 既知の不具合に対する詳細と影響範囲の把握

など...

譲渡契約後にシステムを当社に移管する作業を行う進め方をしましたが、実際に移管作業を始めると、移管するための事前作業で多くの工数を要するものがあることがわかりました。 例えば、iOSアプリの移管について、キーチェーンやAppleでサインイン機能を利用しているiOSアプリを別組織に移管すると、それらの機能が一時的に利用できなくなることがわかりました。これらをユーザー影響なく移管するには多くの工数を要するため、譲渡時には想定していなかった想定外の工数となります。

また、把握していた既知の不具合が譲渡後に想定外の影響を及ぼし、改修するのに多くの工数を使ったケースがありました。事前に不具合の詳細と影響範囲の把握を行っていれば、多少は事前に織り込めたと思います。

まとめ

今回の経験を通じて、事業への影響を最小限に抑えるために事前にシステムDDを行うことの重要さを再認識したとともに、観点やノウハウなど知見を貯めることができました。 また、5つのプロダクトを同時に移管するという稀有な経験から、私自身の成長として、未知で決まった答えのない領域に対して試行錯誤しつつ最大限の決定を繰り返して推進していく能力が向上したと感じました。

本記事が少しでもどなたかのお役に立てれば幸いです。

Vue Fes Japan 2024 でゴールドスポンサーとして協賛します!

はじめに

こんにちは、トモニテ開発部ソフトウェアエンジニア兼、CTO 室 Dev Enable グループの rymiyamoto です。

この度、エブリーは 2024 年 10 月 19 日(土)に開催される『Vue Fes Japan 2024』に、ゴールドスポンサーとして協賛することになりました!

vuefes.jp

エブリーでは、DELISH KITCHEN を現在 Nuxt.js(Vue.js)で構築しており、2018 年から採用しています。
今回の協賛を通して、さらなる Vue.js コミュニティの発展に貢献できればと考えております。

近年は Vue.js 周辺のエコシステムでは新たな潮流も生まれつつあり情報交換や交流を通じて、新たな出会いや気づきを得ることができるでしょう。

ぜひ、タイムテーブルをご覧いただき、気になるセッションに参加してみてください。

vuefes.jp

エブリーにおける Nuxt.js(Vue.js) の活用

Nuxt.js 導入の背景

エブリーでは、DELISH KITCHEN の Web を最初Riot.jsという SPA ライブラリと クローラー向けには静的な HTML を返すため、Express を使って SSR を行っていました。 この構成上コードが二重管理されており、新規ページや機能の開発、運用コストが大きくなっていました。

このような課題を解決するために、Universal アプリケーション(SSR + SPA)の開発が可能な技術を検討し、Angular Universal、Next.js、Nuxt.js の中から Nuxt.js を選択しました。

選定の決め手は以下の通りです。

  • バックエンドに強いチーム構成で、Web フロント開発に長けたメンバーが少なかったため、Nuxt.js のような薄いフレームワークが取り掛かりやすいと考えた。
  • チーム内に Vue.js の開発経験者がいた。
  • Riot.js の SFC(Single File Component) の構造が Vue.js のコンポーネントと似ていたため、システムリプレースが容易だった。

移行後のメリットとして、ユーザー向けとクローラー向けのコードの二重管理がなくなり、一元管理が可能になりました。
これにより開発や QA のコスト削減が実現され、Nuxt.js(Vue.js)の豊富なドキュメント、ライブラリ、活発なコミュニティの恩恵を受け、開発の問題解決が容易になりました。

詳細については、以下の記事をご参照ください。

tech.every.tv

他にもエブリーのテックブログでは、Vue.js に関する記事を随時公開しています。

Nuxt3 化に向けた取り組み

2018 年から Nuxt.js を採用してきたエブリーでは、現在 Nuxt3 化に向けた取り組みを進めています。 こちらも合わせてご覧ください。

tech.every.tv

tech.every.tv

tech.every.tv

Vue.js の開発効率化

Vue.js を活用して開発開発効率化を図るために、VueUse を扱った内容も公開しています。

tech.every.tv

tech.every.tv

皆様とお会いできることを楽しみにしています!

私たちのブースでは、Vue の活用事例等をご紹介する予定です。

またブースには素敵なノベルティもご用意しております。詳細はまた追ってお知らせいたしますので、ぜひ、お気軽にお立ち寄りください!

Pre Party を共同開催します!

エブリーでは、Vue Fes Japan 2024 を盛り上げるべく、同じくスポンサーである OPTiM さんと共同で Pre Party を開催します!

optim.connpass.com

LT(ライトニングトーク)が主体のカジュアルなイベントとなっております。 募集枠は全部で 4 つありますので、ぜひ奮ってご応募ください!

Vue Fes Japan 2024 の参加予定の方や、惜しくも参加できない方も、ぜひご参加ください!

こんな方におすすめです!

  • Vue Fes Japan 2024 に向けて、知り合いを増やしたい方
  • Vue Fes Japan 2024 のプロポーザルがリジェクトされた、敷居が高いと感じた方で LT で発表してみたいなと思っている方
  • Vue に興味があるエンジニアや学生の方
  • Vue での開発に従事されている方
  • OPTiM、エブリー がどのように Vue を活用した開発をしているのか興味がある方
  • OPTiM、エブリー のエンジニア組織について興味がある方

Vue を中心に知識と交流の輪を広げましょう!

※本勉強会/LT会はVue Fes Japan公式のものではなく、スポンサー同士の有志のイベントとなります。そのため本勉強会へのお問い合わせをVue Fes Japan様へ行うことはご遠慮ください。

エブリーでは、ともに働く仲間を募集しています。

エブリーでは、ともに働く仲間を募集しています。

テックブログを読んで少しでもエブリーに興味を持っていただけた方は、ぜひ一度カジュアル面談にお越しください!

corp.every.tv

X ではテックブログや登壇情報、インタビュー記事などエブリーのエンジニアに関する情報を発信していますので、ぜひご覧ください。

https://x.com/every_engineer

最後までお読みいただき、ありがとうございました!