こんにちは、エンジニアの野島(@daumkuchen)です。
株式会社明治様の特設サイト「明治クリスマスこどもパーク」内メインコンテンツ「オカシなコーラスツリー!」の企画・制作を弊社が担当しました。
コロナ禍でのコミュニケーションを模索する中、合唱という形を通じてつながりを感じる体験ができるスマートフォンサイトです。カスタマイズしたキャラクターをポストし、インターネットを通じて世界中の参加者が1つのツリーに集まります。
- テクニカルディレクション
- バックエンド開発
- インフラ構築
自分の担当領域は主にこちらの3点です。
普段はフロントエンドを担当することが多い自分にとって、バックエンド・インフラ領域へのチャレンジとなるプロジェクトです。
具体的にどういったことにチャレンジをして、どういったことに気をつけたのかなどを話します。
チャレンジしたこと
技術選定
新しい技術を使う部分と慣れた技術を使う部分を明確に分け、実現可能性とのバランスを取りました。
- 新しい技術
- Go(API)
- Terraform(IaC)
- 慣れた技術
- Nuxt.js(管理画面)
- Python(ロードテスト)
- Node.js(AWS Lambda)
セキュリティ対策
参加型コンテンツということもあり、多くの方の個人情報を扱います。
なのでセキュリティに関しては一般的なウェブサイト案件よりも厳しい基準を設けて臨みました。
インフラはAWSで構築しました。構成は以下になります。
- VPC:プライベートサブネットを使ったセキュアな構成
- EC2:Trend Micro Cloud One Workload Securityを導入しセキュリティを強化
- NLB:リクエストの分散処理
- CloudWatch:パフォーマンスやリクエストのモニタリング
- SNS, ChatBot:異常検知時の通知(メール、Slackチャンネル)
- WAFv2:Dos攻撃対策
- GuardDuty:脅威検出
- S3:各種ログの保管
上記のようなセキュリティ対策を徹底し、運用期間中は問題もなく稼働させることができました。
役に立ったこと
特にGoはとても良い感触で作業することができました。
- 動作が軽い
- 記述ルールが厳密で記述の揺れが少ない
- ポインタや構造体もシンプルで扱いやすい
- 複雑化しやすいエラーハンドリングがきれいに書ける
- APIに必要なアセットやリファレンスが充実している(例:gin, gin-swagger, gorm)
例:ユーザー作成時の処理の流れ
// 構造体を初期化 user := User{} // ユーザー作成 createdUser, err := controller.Create(user) // エラーが返って来れば、メッセージのレスポンスを返す if err != nil { c.JSON(500, gin.H{ "message": fmt.Sprintf("Error: %s", err), }) return } c.JSON(200, createdUser)
Goの特徴である並列処理を今回使う機会はありませんでしたが、それでも十分メリットを実感することができました。
気をつけたこと
リスクを常に考える
- 課題は自分1人で抱えず、全体に周知する
- 少しでも不明な箇所は事前に相談する
- 運用・インシデント対応マニュアルを作成する
社内の先輩エンジニアとコミュニケーションをとり、常に視界をクリアにしながら進めることを心がけました。
チャレンジした結果
常に勉強しながらの作業は決して楽ではありませんでしたが、その分大きな学びとなりました。
特にセキュリティ周りを厚めに対応したので、今後の案件でも活かす機会がありそうです。
新しいことを覚えるには、実践を通して手を動かすことが一番身につきやすいと実感しました。
成長機会を求めている方をバスキュールは探しています
バスキュールはやりたいことに手を挙げればチャレンジさせてくれる会社で、適切に取り組めばそれをバックアップしてくれる環境があります。
率先して何かにチャレンジしたいと思っている方は、是非ご気軽にお声掛けください。
(特にバックエンドエンジニア募集しています...)