投稿日:
更新日:

エンジニアとしての第一歩を踏み込んだ瞬間

Authors

目次

2020 年 11 月〜2021 年 3 月の約 5 ヶ月間、株式会社サイバーエージェントが企画する長期育成型プログラム CA Tech Accel という企画に参加をしたので、取り組んだこと、成果についてアウトプットしてみようと思います。

はじめに

CA Tech Accel とは

01

CyberAgent Tech Accel(CTA)とは、株式会社サイバーエージェントが企画する長期育成プログラムです。 将来エンジニアとして就業することを希望している 23 卒を対象とし、21 卒内定者の方々がメンターとなって、チームを組み、様々なプログラムに取り組んでいきます。

本イベントでは、メンターのオーナーシップ・フォロワーシップを育てること、参加者(アクセル生) の圧倒的成長と縦、横の繋がりを強くすることを目的としています。

今回、自分は唯一のインフラエンジニアとして参加をしましたが、その他にもフロントエンドエンジニア 1 人、サーバサイドエンジニア 5 人、iOS エンジニア 3 人、ゲームエンジニア 3 人、ML/DS エンジニア 1 人の計 14 名が参加をしていました。

CTA への参加目的

02

自分は、それ以前まで大学で成績を取ることに注力していたため、プロジェクトに参加してソースコードを書いたり、大きなイベントやハッカソン、インターンシップ等に参加した経験が然程多くありませんでした。 また、将来エンジニアとして就業したいと思いつつも、自分が働く姿が全く見えないでいました。 そんな時、CA に内定をもらっている同じ研究室の先輩にこのイベントを紹介してもらい、エンジニアとしての第一歩を踏み出すための絶好の機会だと思いました。

僕は元々、インフラ全般に興味があり、自宅サーバを立てたり、SOHO ネットワークをいじったりなど、小規模オンプレでの経験がありました。 しかし、将来的に自分の技術力がどのように活かせるのか、また、どのように貢献していけるのか不明瞭な状況でした。 以前から様々な Techblog を読んでいたため、近年、SRE(Site Reliability Engineering)が注目されていることや、世の中のサービスの多くがパブリッククラウドを用いて運用されていることを知っていました。 しかし、自分で構築したインフラを誰かに使ってもらったことや、そもそもクラウドサービスを利用した経験が少なかったので、AWS を中心にクラウドネイティブ技術やサービス運用に必要な要素・管理ツール等、諸々について勉強したいと考えていました。

CTA はプログラミングを勉強し始めたばかり、またはこれからエンジニアを目指す学生に向けて、圧倒的成長とスキルアップを促すために開催されました。 僕自身、当時は自分の技術力に自身が持てず不安しかありませんでしたが、21 卒の方や人事の方の後押しもあり、少しでも前進したいと思って本イベントに参加することを決心しました。

CTA での目標

僕は CTA で圧倒的な成長を遂げるため、常に『目的』と『目標』を設定することを意識しました。

まず、現在の自分のスキルを正直に洗いだし、何がしたいのか、そのためにはどうすれば良いのかを考えました。 そして、最初に以下の目的と目標を定めました。

03

04

成長差分

CTA を通して様々な経験をさせてもらい、確かな成長を感じることができました。

イベントでは色々なことに挑戦しましたが、ここでは 4 つのトピックについて成長差分を取り上げたいと思います。

CTA 参加前(半年前)

05

CTA 参加後(半年後)

06

07

どれもほぼ未経験からのスタートとなり、AWS や Kubernetes に関しては初めて触れました。 また、Docker は使ったことがあっても仕組みがわからない、CI/CD は聞いたことはあっても何をするためのものなのか分からない、と、ほぼ全ての技術をゼロベースで取得していきました。 さらに、SRE がどのような技術を扱って何に取り組む職業なのか、DevOps とは何なのか、ありとあらゆることが分かりませんでした。

しかし、CTA で日々メンターの方とコミュニケーションを取りながら、一つ一つ学んでいくことで、ボヤけていたものがようやくはっきりと見え初めました。

08

また、メンターの方はただ単に教えて下さるだけではなく、障害が起きたときにどう対処すると良いのかなどを根本的に理解できるように、"答え" ではなく、"ヒント" を与え続けて下さりました。 そのおかげで、受け身にならず、主体的に全てのことに取り組んでいけました。 CTA が終わり、今となってはどれもある程度の知識を持ち、実際に活用することができるようになっています!

現在では、新たな技術をキャッチアップする際も、ここで学んだキャッチアップサイクルを使ってスムーズに身に付けられるようになりました。 このイベントは、エンジニアとして歩むための第一歩(アクセル)となっただけでなく、極端な話、エンジニアとして本格的に道を決めた言わば人生の転機にもなったと思います。

CTA での取り組み

CTA では以下のようなタイムラインで、様々なことに挑戦しました。 09

期間中はただ単にスキルアップをするだけではなく、社員さんの方々やメンター陣、同期同士のランチ会なども行ったりしました。 それぞれの CTA での進捗状況や取り組んでいる内容について随時交流することで、縦、横共にフラットな関係を築いていくことができました。

10

細かな目標や進捗状況は Notion で共有をして、メンターの方々からアドバイスやフィードバックをもらいながら作業を進めました。

プロダクト

基礎的な勉強

まずは、AWS のキャッチアップを行うため、Amazon Web Services, Inc. が提供している AWS ハンズオンに取り組みました。

最初は、それぞれのサービスが何をするためのものなのかを勉強し、ハンズオンでキャッチアップをしていきました。 そして、まずはサービスを運用するための最低限のインフラを構築していきました。 また、期間中 re:Invent が開催されたりしたので、外部のイベントにも積極的に参加したり、BlackBelt 等も見たりしながら知識をインプットしていきました。

【Docker on EC2 によるアプリケーションのデプロイ】

11

【クラウドサービスにおけるロードバランサの仕組みを理解】

12

【CI/CD のキャッチアップ】

13

【ECS の導入とインフラ移行作業 / ロギング基盤の基礎構築】

14

さらに、リクエストをしたら、Docker や Kubernetes に関する勉強をメンター陣の方々が開いて下さり、それぞれの技術のルーツや、基礎を説明して下さりました。 そのため、リアルタイムに質問したり、手を動かしたりして体験的に学んでいくことができました。

【Docker 勉強会】

15

【Kubernetes 勉強会】

16

アプリケーションチームに提供したインフラ基盤

最終的に以下のようなクラウドアーキテクチャを構築し、アプリケーションをデプロイしました。

17

コンセプト

AWS を用いて一から自力でインフラ基盤を構築したのは今回が初めてになります。

18

まずは、キャッチアップにあたり、AWS の基本的なサービスを使いこなせるようになるため、一通り触ってどんなサービスなのか特徴を知り、今後の技術選定に活かしていきたいという思いがありました。

また、キャッチアップだけでなく、12factor-appを意識した設計にしたり、「オートスケール」「負荷分散」「監視・通知」「ログ収集・分析」といった運用に必要な機能を盛り込んで作ったりしていくことを意識しました。

CI/CD によるデプロイ

19

デプロイの属人化を防いだり、開発効率を向上させたりするため、アプリケーション開発者は、コードを書いて GitHub にプッシュするだけで AWS にデプロイできる CI/CD パイプラインを作成しました。

CI は ワークフローに設定された yaml (run) により、Docker イメージを ECR に、イメージ情報を JSON で定義して S3 に保存します。 また、CD は、CodePipeline を用いて S3 をソースとして、ECR からイメージをプルすることで ECS 上に展開します。

name: CI for AWS
on:
  push:
    branches:
      - main

jobs:
  build-and-push:
    name: Push docker image to AWS
    runs-on: ubuntu-20.04

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Set GitHubCommitHash to env
        run: |
          echo "SHA8=${GITHUB_SHA::8}" >> $GITHUB_ENV

      - name: CI for ECR & S3
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: cta-production
          CONTAINER_NAME: api
          S3_UPLOAD_BUCKET: cta-production-imageinfo
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$SHA8 . -f Dockerfile.production
          docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$SHA8 $ECR_REGISTRY/$ECR_REPOSITORY:latest
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$SHA8
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
          echo '[{"name": "'$CONTAINER_NAME'", "imageUri": "'$ECR_REGISTRY/$ECR_REPOSITORY:$SHA8'"}]' > imagedefinitions.json
          zip imagedefinitions.json.zip imagedefinitions.json
          aws s3 cp ./imagedefinitions.json.zip s3://$S3_UPLOAD_BUCKET/ --quiet

イミュータブルなインフラ設計

20

今回はサーバサイドチームが設計した API(Golang 使用)を ECS を用いて運用しました。

耐障害性を考慮し、AZ を分けてインスタンスを立て、ALB を設置することでトラフィックを分散します。 さらに、より本番環境に近いサービスにするため、Google ドメインで取得したドメイン名を Route53 で付加し、運用を行いました。

また、Aurora への接続情報は Systems Manager の ParameterStore を使用して環境変数を設定し、セキュアに接続可能にしました。

運用に当たって、CI/CD と組み合わせ、開発者は一度構築したインフラの設定変更は行わないように、イミュータブルなインフラ設計(Immutable Infrastructure)を意識しました。

監視・通知 / ログ分析

21

デプロイ時は、CodePipeline のイベントを検知して SNS, Chatbot と組み合わせて Slack に通知します。 また、監視として、UptimeRobot を取り入れ、サービス全体を外形監視します。

ロギング基盤の部分では通常であれば、Logs Insights で完結する部分を、様々なサービスを織り交ぜて作ってみたいという思いから、Lambda を使ってみたり、Kinesis DataFirehose などを使用しました。 また、取得したログは S3 に保存して、Athena(Glue)からクエリをかけられる仕組みを構築しました。

おわりに

今後の目標

22

CTA を通じて、代表的なクラウドネイティブ技術をキャッチアップしました。 今回学んだことを今後のプロダクトで活かしていけるよう、ここからは自分自身の力でスキルのアップデートを目指します。 また、Terraform を用いてコード化してみたり、宣言的な設定によるインフラ展開ができるように IaC を勉強していきたいと思います。

さらに、キャッチアップの中で、インフラエンジニアや SRE エンジニアとして、本当の意味でスキルを取得するためには、やはり要件定義が明確になっているプロダクトや、ある程度のトラフィック量やインフラ規模を誇るサービスでの実務経験が必要だと強く思いました。 そのため、今回学んだスキルをより確かなものにしていくため、インフラエンジニア/SRE エンジニアとして活躍できそうな場を見つけて随時参加していきたいと思います。 そして、これからも様々な経験を積んで、確実な理解のもと適切な技術選定をして 貢献していきたいです。 正直、CTA では 21 卒メンター陣のスキルに圧倒されっぱなしでしたが、いつか対等な立場で技術的な議論ができればなと思います。 その時まで全力で進んでいきます。

CTA の良さ

CTA では、各々の興味があることや習得したい技術をもとに、個別にカリキュラムを決められます。 一方で、自分は初めクラウドを学ぶといってもどんなサービスがあるのか、運用に必要なツールは何なのか、ほとんど知識がありませんでした。 しかし、メンターの方は非難することなく、一つ一つ学んでいくためのロードマップを提案して下さったり、進捗状況を見て、挑戦してみると良いことなどを都度アドバイスして下さったりしました。 また、定例ミーティング以外にも、作業に詰まった時は slack で質問したり、discord を繋いでその場でペアプロをしたりなど、手厚い指導をしていただけました。

23

さらに、勉強に必要な教材(書籍, クラウドサービス利用料, …etc)を CA が全額負担して下さり、思う存分にサービスを盛り込んでいくことができました。

以上のように、メンター陣だけでなく、CA 自体が全力でサポートをして下さったことで、文字通り圧倒的な成長を遂げることができたのではないかと思います。

また、別のチームで活動している同期や、メンターの方ともランチ会などを組んでいただき、交流することで幅広く繋がりを作ることができました。 CTA で得た縦、横の繋がりは、今後の就職活動や、プロダクト開発でも大いに活かしていけると思います。 学びたいスキルを身に付けるだけでなく、ドメイン知識を広げたり、輪を広げたりなど、最高の時期を過ごすことができました。

この記事では、自分のエンジニアとして歩み出した原点(ルーツ)について書き留めました。

CTA を通して、本当に大きな成長を遂げることができたと感じます。

今後は、実務経験を積むことや、知識のキャッチアップサイクルをしていくことで、より確かなスキルにしていきたいと思います。

CTA でメンターをして下さった多くの 21 卒内定者の方々、手厚いサポートをして下さった人事の方々、様々な場面で雑談や交流をしてくれた同期達、本当にありがとうございました!特に、本イベントに招待して下さった@TakumaKurosawa さん、期間中、slack や discord 等で常にサポートをして下さったメンターの@_tetsuya28 さん、評価・フィードバックをして下さった@whywaita さん、@takuya.tokuda.0122 さん、ありがとうございました!このイベントを通じて得たスキルをプロダクトで活かせるよう、今後も邁進していきます!

最終日 Abema Towers にて

24

25