見出し画像

【千里の道も一歩から】エンジニアとして成長するためのアクセルを踏んだ瞬間

2020年11月〜2021年3月の約5ヶ月間、株式会社サイバーエージェントが企画する長期育成型プログラム CA Tech Accelという企画に参加をしていました。
今回の記事では、自分がエンジニアとして歩んでいくための第一歩を踏み出した本イベントの振り返りをしていこうと思います。

はじめに

CA Tech Accel とは

画像1

CyberAgent Tech Accel(CTA)とは、株式会社サイバーエージェントが企画する長期育成プログラムです。将来エンジニアとして就業することを希望している23卒を対象とし、21卒内定者の方々がメンターとなって、チームを組み、様々なプログラムに取り組んでいきます。
本イベントでは、メンターのオーナーシップ・フォロワーシップを育てること、参加者(アクセル生)の圧倒的成長と縦、横の繋がりを強くすることを目的としています。

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

CTAへの参加目的

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

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

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

CTAでの目標

僕はCTAで圧倒的な成長を遂げるため、常に『目的』と『目標』を設定することを意識しました。
まず、現在の自分のスキルを正直に洗いだし、何がしたいのか、そのためにはどうすれば良いのかを考えました。そして、最初に以下の目的と目標を定めました。

成長差分

CTAを通して様々な経験をさせてもらい、確かな成長を感じることができました。
イベントでは色々なことに挑戦しましたが、ここでは4つのトピックについて成長差分を取り上げたいと思います。

CTA参加前(半年前)

CTA参加後(半年後)

どれもほぼ未経験からのスタートとなり、AWSやKubernetesに関しては初めて触れました。また、Dockerは使ったことがあっても仕組みがわからない、CI/CDは聞いたことはあっても何をするためのものなのか分からない、と、ほぼ全ての技術をゼロベースで取得していきました。さらに、SREがどのような技術を扱って何に取り組む職業なのか、DevOpsとは何なのか、ありとあらゆることが分かりませんでした。
しかし、CTAで日々メンターの方とコミュニケーションを取りながら、一つ一つ学んでいくことで、ボヤけていたものがようやくはっきりと見え初めました。

また、メンターの方はただ単に教えて下さるだけではなく、障害が起きたときにどう対処すると良いのかなどを根本的に理解できるように、"答え" ではなく、"ヒント" を与え続けて下さりました。そのおかげで、受け身にならず、主体的に全てのことに取り組んでいけました。CTAが終わり、今となってはどれもある程度の知識を持ち、実際に活用することができるようになっています!また、新たな技術をキャッチアップする際も、ここで学んだキャッチアップサイクルを使ってスムーズに身に付けられるようになりました。このイベントは、エンジニアとして歩むための第一歩(アクセル)となっただけでなく、極端な話、エンジニアとして本格的に道を決めた言わば人生の転機にもなったと思います。

CTAでの取り組み

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

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

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

プロダクト

基礎的な勉強

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

【Docker on EC2によるアプリケーションのデプロイ】
【クラウドサービスにおけるロードバランサの仕組みを理解】
【CI/CDのキャッチアップ】
【ECSの導入とインフラ移行作業 / ロギング基盤の基礎構築】

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

【Docker勉強会】
【Kubernetes勉強会】

キャッチアップに使用した書籍たち

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

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

コンセプト

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

まずは、キャッチアップにあたり、AWSの基本的なサービスを使いこなせるようになるため、一通り触ってどんなサービスなのか特徴を知り、今後の技術選定に活かしていきたいという思いがありました。
また、キャッチアップだけでなく、12factor-appを意識した設計にしたり、「オートスケール」「負荷分散」「監視・通知」「ログ収集・分析」といった運用に必要な機能を盛り込んで作ったりしていくことを意識しました。

CI/CDによるデプロイ

デプロイの属人化を防いだり、開発効率を向上させたりするため、アプリケーション開発者は、コードを書いて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

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

今回はサーバサイドチームが設計したAPI(Golang使用)をECSを用いて運用しました。
耐障害性を考慮し、AZを分けてインスタンスを立て、ALBを設置することでトラフィックを分散します。さらに、より本番環境に近いサービスにするため、Googleドメインで取得したドメイン名をRoute53で付加し、運用を行いました。
また、Auroraへの接続情報はSystems ManagerのParameterStoreを使用して環境変数を設定し、セキュアに接続可能にしました。

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

監視・通知 / ログ分析

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

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

おわりに

今後の目標

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

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

CTAの良さ

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

さらに、勉強に必要な教材(書籍, クラウドサービス利用料, …etc)をCAが全額負担して下さり、思う存分にサービスを盛り込んでいくことができました。
以上のように、メンター陣だけでなく、CA自体が全力でサポートをして下さったことで、文字通り圧倒的な成長を遂げることができたのではないかと思います。

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

まとめ

この記事では、自分のエンジニアとして歩み出した原点(ルーツ)について書き留めました。
CTAを通して、本当に大きな成長を遂げることができたと感じます。
今後は、実務経験を積むことや、知識のキャッチアップサイクルをしていくことで、より確かなスキルにしていきたいと思います。

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

最終日 Abema Towers にて

こちらに移動しました。


この記事が気に入ったらサポートをしてみませんか?