Share
Embed
フルスタックエンジニアとしてゼロからサービスを作る時に考えていること
・開発の各ポイントでどういう思想で設計・構築したか
・フルスタックエンジニアの視点でみたときの発想
などの話
tanaka-yui
September 13, 2020
Transcript
147 slides
-
田中 友彩(たなか ゆい) •所属 AI事業本部 CyberPOP •職種 フルスタックエンジニア 商談からはじめ、インフラ、サーバーサイド、 Webフロント、Android、iOSまで一気通貫です •最近よく使う技術 Nuxt.js, Typescript,
Golang, Kotlin, AWS, GCP, Terraform, Datadog ML系など @yuit1552 -
採用したもの インフラ 全てAWS。Terraformでコード化 • ECS Fargate • DynamoDB • RDS
(MySQL) • AppSync • CloudFront • Elasticache(Redis) • Lambda • Pinpoint • Amplify • Cognito • Code Pipeline • Route53 など Androidアプリ Android Architecture Components を基本としたMVVM • ViewModel • LiveData • Room • coroutine-flow • retrofit2 • okhttp3 • groupie • threetenabp • glide • koin など サーバーサイド Golangでマイクロサービス • go-chi • grpc • gorm • cobra • zap • robfig/cron など Webフロント Nuxt.jsでBFF入れつつvuetify • Nuxt.js • TypeScript • tsconfig-paths • Vuetify • grpc_tools_node_protoc_ts • prettier • express など 要件定義 基本設計 詳細設計 PG -
インフラの概要 ECS Fargate ・・・ コンテナオーケストレーション DynamoDB ・・・ NoSQL のDB RDS(MySQL)・・・RDB
CloudFront ・・・CDN ElastiCache ・・・インメモリキャッシュ Lambda ・・・みんなよく使うと思うサーバーレス Amplify ・・・スマホアプリなどを作るのに最適なAWSのいくつかのサービスをまとめ+それを使いやすくしたツールのセット AppSync ・・・GraphQLの マネージド(Amplifyの一貫にもなってる) Pinpoint ・・・Push通知(Amplifyの一貫にもなってる) Cognito ・・・認証基盤(Amplifyの一貫にもなってる) Route53 ・・・DNSサーバーとかドメイン管理。 要件定義 基本設計 詳細設計 PG -
インフラの概要 ECS Fargate を採用した理由 • インスタンスそのものを管理しなくていい → OSの脆弱性パッチ当てとかしなくていい • AWSの他サービスと親和性高い→EC2とか使ってても乗り換えが比較的容易
• ECS Fargateのversion up の頻度はかなりゆっくりなのでversionの追従が楽 要件定義 基本設計 詳細設計 PG -
インフラの概要 ECS Fargate を採用した理由 • インスタンスそのものを管理しなくていい → OSの脆弱性パッチ当てとかしなくていい • AWSの他サービスと親和性高い→EC2とか使ってても乗り換えが比較的容易
• ECS Fargateのversion up の頻度はかなりゆっくりなのでversionの追従が楽 一人でやったのでとりあえずお手軽なのが嬉しい( ^ω^ ) 要件定義 基本設計 詳細設計 PG -
インフラの概要 他考えたサービス 大人気「kubernetes」、のマネージドEKS 別案件でGoogleのGKEを使っていたが、確かにPodのスケールがECSより早くスパイクに強かったり(設定次 第ではありますが)して非常に優秀だと思いますが、 • 頻繁にあるkubernetes本体のバージョンアップにノードを追従していくのが面倒 (特に一人でやってるとかなり面倒) • デプロイの仕組みを独自につくる必要が結構ある
(CI/CDはECSでも使うとしても、マニフェストファイル変更した時の扱いとかとか、、、) 要件定義 基本設計 詳細設計 PG -
インフラの概要 ということで、ECS Fargateを採用しました。 また、そのあとのデプロイなども楽にするため、こんな感じのお手軽パイプライン組みました。 GitHub Action上で ・docker build ・ECR へ
docker push 要件定義 基本設計 詳細設計 PG -
インフラの概要 ということで、ECS Fargateを採用しました。 また、そのあとのデプロイなども楽にするため、こんな感じのお手軽パイプライン組みました。 GitHub Action上で ・docker build ・ECR へ
docker push Cloud Watch Eventで ECRを監視し、pushされたら CodePipeLine実行 要件定義 基本設計 詳細設計 PG -
インフラの概要 ということで、ECS Fargateを採用しました。 また、そのあとのデプロイなども楽にするため、こんな感じのお手軽パイプライン組みました。 GitHub Action上で ・docker build ・ECR へ
docker push Cloud Watch Eventで ECRを監視し、pushされたら CodePipeLine実行 buildステージは飛ばすように し、ECRからdockerイメージ を取得しdeploy 要件定義 基本設計 詳細設計 PG -
Webフロントの概要 ReactやNextも使ったことありますがReactでFormik等のライブラリを使わ ない場合 onChange等でInputの変化を検知し ↓ componentのstateに値を入れる ↓ propsでcallbackする かといってライブラリ使うと、ラ イブラリに依存してしまうから、
やめたくなった時にやめるの大 変になる GolangでWire使わなかった時と 同じ気持ちです 要件定義 基本設計 詳細設計 PG