Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

AWS のアーキテクチャ・ベストプラクティスを、 GameDay 動画を通じて学んだ

CTOの椎名です。

いよいよ AWS Re:Invent 2017 が近づいてきました!弊社からは自分とサーバーエンジニアがもう2名、ラスベガスに出陣します。 11/7 には会社でpre-partyイベントも開催し、非常に盛り上がって日本からの参加者同士での交流も深まりました! http://techblog.timers-inc.com/entry/re_invent_2017

自分は今回嬉しいことに GameDay への参加が決まりました!(セッション予約受付開始直後からPCに張り付いて最優先で参加登録をしました)

何か予習できるものはないかと調べてみたら、AWSYoutubeチャンネル上に GameDay Essentials というシリーズの動画に巡り会いました。各1時間 x6話なのでそれなりにボリュームはありますが、面白くてスラスラと進みました。 GameDayの心構えにもなったし、 AWS のベストプラクティスな考え方のおさらいにもなったし、非常にタメになったのでポイントをシェアします。

そもそも GameDay とは?

原文:

The event immerses teams into a fictitious scenario where they pretend it’s their first day as the DevOps lead at the “hot” startup called Unicorn.Rentals! Teams work to keep users (and the boss) happy and costs low by managing their infrastructure in a live AWS environment during this competitive event. Throughout the day, teams are challenged to build and maintain highly available and highly scalable solutions.

和訳:

このイベントでは各チームが "Unicorn.Rentals" というスタートアップのDevOpsリードとして働き始める、という擬似的なシナリオに飛び込みます! 各チームは本番稼働しているAWSインフラを管理することで、ユーザー(と上司)を満足させながらコストを抑えるために競い合います。1日を通してチームはスケーラブルでありながら可用性も高いソリューションを構築運用することが求められます。

-- https://aws.amazon.com/jp/blogs/apn/the-top-eight-tips-for-gameday-success-and-some-gamedonts/

国内イベントで言うと ISUCON に似たパフォーマンスチューニングイベントのようですが、

  • AWSベースである
  • AWSのコスト(料金)もスコアのうちに含まれる
  • 擬似的なハプニングなどが起こり、トラフィックもダイナミックに変わる

というよりAWSの実務によった内容になっているらしいです(ネット上の情報ベースなので間違ってたらすみません)。

GameDay Essentials ではこの GameDay で高いスコアを出すために意識すべきポイントや、設計tipsを色々と紹介してくれています。

1. Recon (情報収集)


GameDay Essentials | Episode 1 - Recon

GameDay Essentials 第1話のテーマは Recon (情報収集) です。 GameDay開始と共に渡されるAWSアカウントに関する説明やドキュメントは不十分なので、自分でそのアカウントで運用しているアプリケーションの構成を把握しにいくしかないようです。

これは実際の現場でも一緒だと思います。クラウドインフラに関して「どこに何があってどういう設定か」が全て完璧にドキュメントされている現場は少なく、ある程度はエンジニアが自らコンソールなどに飛び込んで情報収集をする必要があります。

いくつかやるべきところ:

  • Cloud Formation で構成が組まれてる場合があるから、 Cloud Formation は覗きにいくと良い
    • ただ Cloud Formation で全て網羅してない事も多いのでこれだけで満足はしない
  • IAMを見る
    • どんなRoleがあり、どれぐらい使われてるか
    • 不必要なユーザーがいないか
      • GameDay はチームからチームに対して攻撃を行う事もあるらしいからちゃんと穴を防ぐのは大事
  • 各サービスの Describe を CLI ベースで行う
    • EC2, RDS, ELBなど
    • 全体的な Describe コマンド&見えやすくアウトプット整形してくれるようなシェルスクリプトを事前に組んでおくと便利
  • 稼働中インスタンスに入って、動作してるアプリケーションの内容確認

2. Scaling (スケール)


GameDay Essentials | Episode 2: Scaling

降りかかるトラフィックに関してきちんと負荷分散ができるようにしないと、すぐにアプリケーションはパンクしてしまいます。EC2が1台だけ配置されててどこに直接トラフィックが流れてきているケースを想定して、すぐに出来るような負荷分散の方法を紹介してます。

この動画は主に Auto-Scaling について説明してましたが、「そもそもEC2に流さなくて済む」というソリューションについても口頭で紹介してました。 S3 static Hosting や Lambda などの選択肢が出てました。

さくっと Auto-Scaling を設定したい場合:

  • EC2のAMI取得
  • Launch Config 設定
  • ELB設定
  • Route53設定
  • CloudWatchアラートを設定し、CPU 50% ぐらいでスケールさせるように

これぐらいをさくっと出来ればまず最低限の分散は出来そうです。

3. Changes (変化)


GameDay Essentials | Episode 3: Changes

Changes (変化) とは、 外的な変化のキャッチ=監視 と、 能動的に変化させる=デプロイ を大きくテーマとして取り扱った会です。監視もデプロイもAWS内外に様々なソリューションがあるので広い回にはなりました。なので、その中で特に自分にとって肝だったところを記載しております。

監視について

  • Cloudwatch Logs は使いやすいので、これを使うと良い
  • DatadogなどのSaaSもある
    • が、GameDayで使いたいかは個人嗜好次第
  • Cloudtrail で AWS APIコール履歴の取得
    • デフォルトはOFFなので、まず自分でオプトインする事を忘れず。
    • 自動的に行われている処理の把握
    • 不正ユーザーによる想定外の操作の把握

デプロイ

  • Beanstalk
    • 特にラク。既存のアプリケーションをDocker化して、 Beanstalk経由でデプロイする事ができる
  • 手動でSSHで入って httpdアプリケーションサーバーの設定をするのはツライ。特にインスタンス数が増えると。
    • AMI取得して、LaunchConfig で起動時処理のシェルを自分で書くのはさくっと出来る
    • CloudFormation も選択肢。StackSetsを使うとモジュラーに管理できる
  • サーバーレスなものは SAM 使うといい
    • API Gateway, Lambda の構成管理〜デプロイが非常に簡単になる
  • ECS はコスト面で非常に優秀
    • 初期設定は大変である

インスタンスに入る時

  • インスタンスに対してSSHできない(keyがない)
    • GameDay では普通にあり得るケースらしい
    • そういう時はAMI取得して→新しくインスタンス作って→その際に key-pair を定義し直すと良い

4. Decouple (疎結合化)


GameDay Essentials | Episode 4: Decoupling

GameDayで渡されるアプリケーションは非常に簡素に作られている事があるようです。1インスタンスの中で全てをやったりと、サービス内のコンポーネント同士が密結合になっている事がある時は、それらを疎結合化する事が重要です。

それによって可用性・スケールを高めたり、コンポーネント毎にボトルネックを見つけてパフォーマンスチューニングを追求する事も可能になります。 まず例として紹介されたアプリケーションアーキテクチャは、「EC2のオンメモリでメッセージを受け取って(HTTP経由)、それを集めてごにょごにょして出力する」という概要のものでした。

ここで簡単に課題感の想像がつきます:

  • ELBで負荷分散すると、インスタンスによって保存されるメッセージが違う
  • スケールインやインスタンス問題による再起動が走ると、オンメモリのデータは消失する

ここから「疎結合化」をテーマに様々なレイヤーでのTipsが紹介されます。

データストア

インスタンス内にデータ保存しているものは、まず外に出しましょう。その時にデータストアの選択肢はいくつかあります。 * 簡単なデータならS3に置くのもいい。可用性は非常に高い * Elasticache (memcached, Redis) はwrite, read負荷が高いところに効く * RDSは堅牢さ (multi-AZ, backup, failoverなど) * DynamoDB(NoSQL) もスケール、可用性ともに扱いやすい

キャッシュソリューション

この文脈における「キャッシュ」には二つの種類があります。パフォーマンスや可用性、コストなどの観点からキャッシュを適切なところに挟むのは非常に有力です。

  • HTTPキャッシュ
    • CDN(CloudFront) や Reverse Proxy (Varnish) など
    • ほとんど変わらないデータ(静的ファイルなど)はHTTPキャッシュで良い
  • データキャッシュ
    • 頻繁に変わるが、アクセスも高いからパフォーマンス高いところに置いておきたい時
    • キャッシュのインバリデーションのロジックもちゃんと組まないといけないので注意
    • メモリキャッシュ(memcached, Redis)など

脱EC2

アーキテクチャを考える時に、「EC2を完全に廃止できないか」を選択肢に入れる

  • Lambda + APIGateway
  • メッセージの in-out するだけなら、SQS や Kinesis などのソリューションも良い
    • Kinesis Firehose なら入ってくるデータを変換(整形など)もできる

5. Security (セキュリティ)


GameDay Essentials | Episode 5 - Security is Job Zero

GameDayだとしてもセキュリティは非常に重要です。先述しましたが、GameDay参加者同士でもアカウント侵入などの攻撃は過去にも行われており、性善説を信じて丸腰で戦ってると潰されてしまうリスクがあるのです。

本番稼働同等の緊張感を持った適切なセキュリティ管理のtipsを紹介していました。

  • アイデンティティ:IAM
    • User, Role管理
      • ポリシーサマリーで権限のサマリーが見える
      • アクセスアドバイザーでいつ何にアクセスしたかも見える
      • 「セッション無効化」機能で、よくないUser/Roleを簡単に止めることができる
  • Trusted Advisor
    • セキュリティのアドバイスをくれる
  • CloudTrail
    • 予想外のことが起こった時に調べるツール
    • CloudTrail → CloudWatch Logs → Lambda → Elasticsearch と流すことで、ログを集めて検索性も高めることが出来る

6. Cost Optimization (コスト最適化)


GameDay Essentials | Optimizing for Cost

最終回はコストの考え方です。 GameDayでは「とりあえずインスタンス100台立ち上げとけば良いんだろ」と言った 札束で頬を叩く 的な策は通用しないようです。チームの使ってる料金もスコア計算のうちに使われているらしく、いかにコスパの良い構成が組めるかも腕の見せ所になります。 実際に自分がお金を払っているつもりで設計をしよう、と言ってました。

  • Free-Tier をうまく使う
    • 1ヶ月ごとに付与される Free-Tier (無料利用)枠が、色々なサービスに存在してる
    • 各サービスの Free-Tier を理解して、それらを上手く活用できるようなアーキテクチャにすると良い
    • Free-Tier 一覧: https://aws.amazon.com/jp/free/
  • Auto-Scaling設定の際は、どこまでを固定値にするか、どこまでを動的にするか、を見極める
    • 「ベースラインでこれぐらいは必要」という台数・スペックに関しては Reserved 購入しよう
    • それ以上の動的なトラフィックを Auto-Scaling で賄うようにしよう
    • Spot Auto Scaling と On-demand Auto Scaling を組み合わせる
      • Spotの方がコスパが良い
      • On-demand のスケールポリシーを Spot に紐付け連携させる
    • RDSもスケール(スケールアップ・スケールダウン)ができる
  • Cost management ダッシュボード
    • どこにお金がかかってるのが分析するのに便利
    • 予算アラートを設定しておくと予想外な値段スパイクにも対応できる
      • 悪意ある人間がS3に大きなファイルを置いてコストをかけてしまう、など

いかがでしょうか。情報の羅列にはなりましたが、AWSで新規サービス構築・既存サービス運用する際のリファレンスとして活用できるようなtipsが色々あったかと思います。GameDayでも、GameDay外のサービス運用でも参考になる情報になってるので、興味のある方は、各動画のリンクも貼ってますのでぜひご覧になってください!

積極採用中!!

子育て家族アプリFamm、カップル専用アプリPairyを運営するTimers inc. では、現在エンジニアを積極採用中! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる