AWS Startup ブログ

【週刊 Ask An Expert #10】サーバーレス化を検討している?そこは AWS Amplify でしょ。 AWS Loft Tokyo で受けた質問まとめ #AWSLoft

こんにちは、スタートアップ ソリューションアーキテクトの松田 (@mats16k) です。

だんだん暑くなってきましたが、いかがお過ごしでしょうか。私は半ズボンでの出勤を解禁しました(スタートアップなら普通ですよね?)。今回は週刊 Ask An Expert 記念すべき第10回目をお届けしたいと思います。「参考になった!」「いい内容だ!」と思っていただけたら、ぜひハッシュタグ #AWSLoft を付けてシェアしてください。もちろん、改善点・ご要望もお待ちしております。

Ask An Expert ?

さて、皆さん AWS Loft Tokyo はご存知でしょうか?
目黒セントラルスクエア17Fにある、AWS を利用中のスタートアップとデベロッパーのためのコワーキングおよびイベントスペースです。その中に、AWS のエキスパート – Solutions Architect や Cloud Support Engineer といった中の人に技術的な質問ができる、Ask An Expert カウンターがあります。そこでは毎月、来場者の方から100件以上にものぼるご相談をお受けしています。

ある日の Ask An Expert (Cloud Support Engineer 福嶋)

この連載では、我々 AWS のエンジニアが Ask An Expert でどのような質問を受け、どんな感じで対応しているのか、 *非常にざっくりと* ご紹介していく「週刊 Ask An Expert」をお届けしていきます。他の AWS Loft 利用者がどんな質問をしているのか、自分が知らなかった新しいトピックはないか、Ask An Expert ってどんなところなのか、一緒に見ていきましょう!
※ 似たご質問をまとめたり、ざっくりまとめにくいご質問を省いたりしているため、実際のご質問件数・内容とは異なる部分があります。


週刊 Ask An Expert #10 (2019/06/17 – 06/21)

この週の対応者は SA:成田、内田、松田、CSE:福嶋、古野、榎本 でした。

Q: ALB + AWS Fargate でジョブの停止起動が繰り返される。ALB にアクセスすると 502 エラーとなる。

ALB のヘルスチェックが通っていませんでした。ログを確認したところ、DB が見つからないとのことで Rails が起動に失敗していたので、まずはこちらの原因調査を進めて頂くようご案内しました。

Q: 1 秒に 1 回外部 API を叩いて、結果を保存したい。出来ればサーバレスがいい。

Amazon CloudWatch Events + AWS Lambda では 1 秒単位で起動できない。サーバレスでやるなら、Lambda を 15 分間実行して、その中で 1 秒ごとに外部 API を呼ぶ必要がある。コンテナの利用が許容されるのであれば、AWS Fargate でコンテナ内で cron を回すのもいいかもしれません。

Q: AWS CloudFormationAmazon Route53 のレコード追加を行おうとするとエラーになる。

HostedZone が無かったため、CloudFormation 外で作成するか CloudFormation 内で一緒に作成する必要があるとご案内しました。

Q: Amazon EC2 起動時に実行される UserData 内で EC2 の情報を扱いたい。

インスタンスメタデータの利用をご案内しました。インスタンスメタデータの取得は下記URLから可能です。

curl http://169.254.169.254/latest/meta-data/

Q: Amazon API Gateway + AWS Lambda で Amazon S3 の Presigned URL を払い出して、クライアントにファイルをアップロードさせたい。これに認証を付けたいがどうすればいいか。

API Gateway の認証機能で実装することが出来ます。Cognito Federation Identities を使っての IAM 認証か、Cognito User Pools を使っての Cognito 認証か、Lambda によるカスタムオーソライザが選択可能です。

Q: Amazon Cognito User Pools の利用で既存のサービス DB との統合や使い分けをどうすると良いのか。

サービス用のデータで「頻繁にアクセスがあるもの」や「更新が掛かる可能性が高いもの」はサービス側に持たせるほうが 、Cognito へのアクセスを減らせるので、スケールする可能性が高いとご案内しました。(Cognito には認証に必要な情報のみを持たせる)

Q: アフィリエイトのようなシステムを作る際に、 Amazon DynamoDB で集計を行うにはどのようにすればよいか?DynamoDB だけで完結出来るか?

DynamoDB のモデリングで可能な範囲の集計方法と、DataLake 的な設計でどう集計すると楽か、DynamoDB Streams などからアーカイブデータを生成するパターンなどをご案内しました。

Q: Amazon S3 で静的サイトを作ろうとしている。サーバーレス (AWS Lambda) を考えているが、データストアをどうすべきか。

当初 Amazon Aurora を検討されているとのことでしたが、Lambda の特性上、リクエスト毎にコネクションが張られることと、VPC 内で起動する場合に ENI 作成時間が必要となることを踏まえると、DynamoDB の方が良さそうであることをご案内しました。(規模がそれほど大きくなく、ENI 作成時間を許容できるのであれば、Aurora をおすすめすることもあります。)

Q: GPU での処理の際に AWS Batch の利用を考えているが、AWS Step Functions は利用したほうが良いか。

対応する処理において状態遷移(成功したときはA、失敗したときはB)という処理であったり、エラー時のリトライ処理などを行いたい用途では Step Functions をご利用頂くと良いかもしれません。Step Functions から AWS Batch の呼び出しも可能です。

Q: 認証として Amazon Congito の利用を考えている。認証されたユーザーへ Amazon S3 への Put 権限を付与する想定だが、Put 出来る範囲の絞り込みは可能か。

可能です。下記ドキュメントに記載のあるとおり、ポリシーで sub を含めることができます。

Amazon S3: Amazon Cognito ユーザーに自分のバケット内のオブジェクトへのアクセスを許可する

Q: IoT の機器でイベントを受け取りたい。

AWS IoT Core では MQTT プロトコルを利用できるため Subscribe をして頂き、メッセージを受信することが可能とご案内しました。

Q: 現在 AWS Elatic Beanstalk を使っているが、どのように CI/CD を実現できるか知りたい。

お伺いした所、ソースコードは Github とのことだったので AWS CodePipeline を利用した CI/CD についてご説明しました。

Q: 現在 AWS Elatic Beanstalk を使っているが、コンテナ化を検討している。どのような構成が考えられるか。

Elastic Beanstalk は Docker (Single / Multi Container) のいずれも対応しているので引き続き、Elastic Beanstalk を使うことも可能です。
もしくは Amazon ECS を使う方法も考えられます。AWS Fargate であれば基盤は AWS 側でマネージされるため、お客様は動かすコンテナのみにフォーカスすることが出来ます。

Q: スタートアップで Ruby on Rails で Web アプリを作る際に、AWS Elastic Beanstalk の利用を検討している。AWS はあまり使ったことがないが問題なさそうか。

はい、Elastic Beanstalk を使うことはユースケースにマッチすると思います。Elastic Beanstalk を使うことで、よく AWS で採用される構成を容易に構築することができます。
また、Elastic Beanstalk はデプロイの機能も有しているのでロールバックなども容易に行うことが可能です。

Q: Ruby on Rails の Web アプリを運用しており、サーバーレス化を検討している。CRUD が出来ればよいのだがどのような構成が良さそうか。

モデルケースではありますが、AWS でよく採用される構成についてご案内しました。

また、上記リソースを直接意識せずサーバレスアプリケーションを構築できる AWS Amplify というライブラリもあるので、ご検討いただければと思います。

Q: AWS Fargate の負荷試験を行いたいがどうすればいいか。

テストポリシーについては こちら をご確認下さい。

AWS Fargate の負荷試験という意味では、AutoScaling を設定することで動的にタスク数を変更できるため、タスク数を静的に決めずこちらを利用する設計がよろしいかと思います。
AutoScaling の動作やしきい値の確認のための負荷試験用の AWS サービスは無いので Jmeter 等をご利用下さい。

Q: エラーページを出したいがどうすればいいか。

ALB をご利用しているとのことだったので、固定レスポンスアクション の利用をご提案しました。

Q: ユーザーの動向を Amazon DynamoDB のテーブルに追記することを考えている。一定周期で Amazon DynamoDB Streams から AWS Lambda を経て Amazon S3 に格納されたデータを SQL で集計したい。どのような構成がよいか。

AWS Glue のジョブを定期的に実行し、RDS への書き込みと S3 上のオブジェクト集約を行うとよいかと思われます。DynamoDB Streams から Lambda を経て S3 バケットに書き込まれたデータはサイズが小さいため、Glue で集約しておくことで Athena などから再利用する際にパフォーマンス、コストメリットを得られます。

Q: コスト最適化のために、Amazon EC2 を CloudWatch Events で夜間のみ停止しようと考えている。AutoScaling はしていない。方針についてレビューしてほしい。

インスタンスの起動/停止とあわせて、ELB への紐づけを行えば問題ないかと思われます。AutoScaling Group での構築が可能であれば、Scheduled Scaling がご利用頂けるためよりシンプルな構成で実現することが可能です。

また、現在 C4 インスタンスをご利用いただいていたので、パフォーマンスの向上とコスト削減が見込める C5 インスタンスへの移行を合わせてご案内しました。

Q: Codeシリーズを利用し CI/CD のパイプラインの整備を考えている。Gem リポジトリの不具合等でテストやデプロイに支障が出るのを避けるために手動でのデプロイを残すべきか悩んでいる。

一般論として、CI/CD のパイプライン外でのデプロイはそもそも許容しないほうがよろしいかと思います。パイプラインの安定性を高めるためには、ライブラリのミラーをS3に追いたり、Build/Test 用の Docker Image を事前に作っておく等で対応可能とご案内しました。

Q: 現在、個人ごとに AWS アカウントを発行しているが、アカウントの管理・運用について教えてほしい。

AWS アカウントはプロジェクトや環境ごとに払い出すことが多いです。複数名でご利用の際は、AWS アカウント内で IAM User を発行することが出来ます。

組織内での複数アカウントの管理については AWSにおけるマルチアカウント管理の 手法とベストプラクティス をご覧ください。

Q: AWS のマネジメントコンソールへログインした際に選択されるリージョンがいつもオハイオになってしまう。

https://console.amazonaws.com にアクセスすると最後に使用していたリージョンにリダイレクトされます。

https://<region_name>.console.amazonaws.com にアクセスすることでログイン後任意のリージョンに切り替えることも可能ですが、今回は誤ったリージョンでブックマーク登録をされていたようでした。

Q: Amazon DynamoDB のデータを Amazon AthenaAmazon Personalize で分析したい。データをどこにどの形式で置くと良いか。

現状、Personalize への入力は csv のみになりあます。Athena で csv の読み込みは行えるため、共有する場合も csv でよろしいかと思います。どちらも S3 からデータを読み込むので、データの保管場所は S3 がよろしいかと思います。


週刊 Ask An Expert まとめ、今回はここまで

最後までお読み頂きありがとうございます!
冒頭に書いたように、似たご質問をまとめたり、端的にまとめづらいご質問を省いているためそっくりこのままやり取りが行われているわけではありませんが、様々なご相談をいただいていることが伝わっていれば嬉しいです。実際の Ask An Expert カウンターでは、より詳細なご案内・議論が行われています。
それではまた次回をお楽しみに!

このブログの著者

Kazuki matsuda松田 和樹 (Kazuki Matsuda) @mats16k

Container とか BigData が好きなスタートアップ ソリューションアーキテクト。最近は Serverless も好きです。