AWS Startup ブログ

【週刊 Ask An Expert #09】Amazon Cognito でサーバーレス認証基盤を作るには?ビジネスサポート60日間無料キャンペーンとは? AWS Loft Tokyo で受けた質問まとめ 20190610-0611 #AWSLoft

こんにちは、ソリューションアーキテクトの塚田 (Twitter: @akitsukada) です。

さて、先週は AWS Summit Tokyo 2019 が幕張メッセにて開催されましたが、お楽しみいただけたでしょうか?Day 1 〜 3 のスタートアップ関連速報&資料は以下に随時まとめているので、ぜひ見てみてくださいね。

そんな AWS Summit Tokyo の興奮も冷めやらぬ中、週刊 Ask An Expert 第9回目をお届けしたいと思います。先週は AWS Summit 期間中につき、Ask An Expert は月曜・火曜の二日間営業でしたが、多くのご相談をいただきました。「参考になった!」「いい内容だ!」と思っていただけたら、ぜひハッシュタグ #AWSLoft を付けてシェアしてください。もちろん、改善点・ご要望もお待ちしております。

Ask An Expert ?

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

ある日の Ask An Expert – Machine Learning Specialist SA 大渕

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

週刊 Ask An Expert #9 (2019/06/10 – 06/11)

この週の対応者は SA:原、針原、CSE:古野 でした。

Q: Amazon Elastic Container Service(ECS) でサービス構築中。AWS CloudFormation による構成管理を導入しようとしているが、大きくなってきたスタックを分割するにはどうすればよいか。

スタックを分割するには、クロススタック参照(Export/Import)、Nested Stack、または共通部分を部品化する AWS::Include transform といった方法があります。お話を伺い、今回はクロススタック参照により各スタックのライフサイクルを分けて管理する方法をおすすめしました。

Q: (続き)Amazon ECS へのデプロイはどう行うのがよいか。

AWS CloudFormationAWS CodePipelineAWS CodeDeploy による Blue/Green デプロイ などの方法があります。今回は、CodeDeploy を使った Blue/Green デプロイがニーズに合いそうだったのでご案内しました。

Q: (続き)AWS CodePipeline では何が出来るのか。

CodePipeline の機能概要(パイプライン管理、デプロイ、承認プロセス、Amazon ECR をソースにした ECS 連携、開発環境と本番環境の一元管理、クロスアカウントパイプライン etc)を解説しました。

Q: これからサービスをリリースするにあたって、AWS サポートについて教えて欲しい。

AWS サポートについてご紹介しつつ、本番環境での運用が始まるにあたってはビジネスサポート以上のプランをご利用いただくことをおすすめしました。Cloud Support Engineer (CSE) によるE メール/チャット/電話での24 時間年中無休のサポート、選択可能な緊急度と初回応答時間の充実化、Trusted Advisor の全チェック項目有効化など、システムの本番稼働を支えるために有用なリソースが利用可能になります。

また現在、AWS Summit 限定ビジネスサポート 60 日間無料トライアルキャンペーンを実施中です。お申し込み受け付けは 7/11(木) までです。この機会にぜひお試しください!

Q: AWS CloudTrail を利用した監査・通知システムをサーバーレスで構築したい。Amazon S3 Select で、標準対応していないようなフォーマットのデータを扱うにはどうすればよいか。

AWS CloudTrail -> Amazon Simple Notification Service(SNS) -> Amazon Simple Queue Service(SQS) -> AWS Lambda(S3 Select実行) → 通知

といったフローをご検討中でしたが、このうちの

SQS -> Lambda(s3 select実行)

SQS -> Lambda(整形 & Amazon S3 へ保存) -> SQS -> Lambda(S3 Select実行)

にして、整形済みステータスを Amazon DynamoDB に入れる方式を提案しました。
Amazon Athena を利用する方法も議論しましたが、今回は S3 Select が合っていそうでした。

Q: 自社の開発チーム用に、AWS Glue の開発者エンドポイントと Zeppelin Notebook をセットアップする手順書を作ったので見て欲しい。

拝見したところ、開発者の方が 開発者エンドポイントのセットアップや Amazon EC2 インスタンスの起動を毎回実施するような手順になっていたので、初回とそれ移行の手順書を分割することを提案しました。また、AWS CLI やマネジメントコンソールを利用する箇所が多く見られたため、可能なら Amazon CloudFormation によるコード化をご検討いただくようご案内しました。

Q: Amazon Relational Database Service(RDS) で、RDBMS のパラメータをカスタマイズしたい。

DB パラメータグループについてご説明しました。

Q: Amazon Cognito でサーバーレスの認証基盤を構築したい。

BtoB なサービスを構築されているとのことでした。一般的なシナリオと、Cognito User Pools の認証フローについて説明しました。

要件を伺った上で、必ずしも IP アドレス制限が必要でなさそうなこと、MFA の有効化等によるセキュリティ強化も重要であることなどについて議論しました。また、クライアントから Amazon S3 上のオブジェクトへアクセスさせたいとのことだったので、ID Pool と AWS IAM による権限制御の方法をご案内しました。

Q: ローカルのラップトップで開発している時に IAM Role の権限を与えたい。

AWS CLIAWS Security Token Service(STS) の assume-role コマンドを叩き、得られたクレデンシャル(Access Key, Secret Access Key等)を環境変数等にセットして使うことができます[docs]。環境変数にクレデンシャルがセットされていれば、AWS SDK はそれらを参照して権限を得られます。
本番環境でも同様に環境変数を利用することは可能ですが、Amazon EC2 のインスタンスプロファイルや、Amazon ECS のタスク用 IAM Role を設定すれば AWS SDK がそれらの IAM Role を参照してくれます。詳しくは認証情報プロバイダチェーンに関する情報(AWS SDK for Java の例)をご参照ください。

Q: Amazon DynamoDB のデータをバックアップ、または Amazon S3 に複製するにはどうすればよいか。

Amazon DynamoDB のバックアップ & リストア機能DynamoDB Streams を利用して S3 にデータを反映する方法を紹介しました。

Q: 現在 Ruby on Rails 上で Cognito User Pools の認証や情報管理を行っているが、Token の管理が煩雑になってしまう。

AWS SDK for Ruby を用いてサーバーサイドから Cognito User Pools を操作することも可能ですが、JavaScript の Cognito SDK を使ってクライアントサイドから Cognito にアクセスすることで Token の管理や認証フローの操作を抽象化してくれます。ご検討いただくようお願いしました。

Q: AWS Fargate で1日1回実行するジョブ群がある。ジョブ間のエラー検知(exit 1 など)を含むフロー制御をしたい場合、AWS Step Functions の利用は妥当か。

はい、Step Functions から AWS Fargate のタスクを呼べますし、エラーハンドリングも出来るので妥当かと思います。Fargate 単独でエラー検知をしたい場合は、CloudWatch Events でコンテナの状態変更イベントを取得する方法があります。

Q: AWS Glue で Apache Spark タイプのジョブを使っているが、連携されるファイルが少ない。Python シェルジョブへの移行も考えているが、どのような使い分けをすれば良さそうか。

Python シェルは、Spark フレームワークの利用や並列分散処理が必要でない、比較的軽い処理にお使いいただけます。また、課金体系も、Spark タイプでは ETL ジョブごとに最小 10 分、Python シェルタイプでは ETL ジョブごとに最小 1 分となっている点などが違います(最小単位以降はどちらも1秒単位の課金です)。移行コストなど踏まえ、実際にお試し頂きながらご判断ください。

その他、ユースケースのアイデアはこちらもご覧ください。

Q: AWS Glue の Pythonシェルでは、一時ディレクトリにファイルを配置することは可能か?スクリプト内でAmazon S3 から取得したファイルをテンポラリとして配置したい。

はい、可能です。

Q: データストアとして Amazon RDS を使っているが、全文検索を利用するために一部の情報を Amazon Elasticsearch Service に登録したい。何かよい方法はあるか。

AWS Database Migration Service(DMS) はいかがでしょうか。データ移行のソースとして Amazon RDS を、ターゲットとして Amazon Elasticsearch Service をサポートしています。ご検討いただき、要件に合わない点などがあればまた SA や AWS サポートにご相談ください。

Q: Chat bot のシステムを考えている。稀にオンプレミスとの接続が必要なシステムとなるが、どのような構成が取れそうか。利用想定ユーザーが多いので、スケールするようなシステムが良い。また、できるだけサーバーレスで構成したい。

Amazon API Gateway の WebSocket APIAWS Lambda、あるいは AWS AppSync と AWS Lambda などを利用した構成が考えられますが、AWS Lambda からオンプレミスのリソースにアクセスが必要な場合、VPC 接続に必要なElastic Network Interface (ENI) 生成のオーバーヘッドがかかる場合が出てきます。それが許容できない場合は、API Gateway/AppSync のバックエンドに Lambda でなく AWS Fargate などで構築した HTTP エンドポイントを指定するなどの回避策が考えられます。

関連する事例情報や継続した支援が必要な場合は、AWS の営業や SA といった担当チームにご連絡いただけるようお願いしました。

Q: Amazon EC2 からオンプレのサーバーにアクセスしたいができない。VPN の設定をやってみたがうまくいかない。

ヒアリングしてみたところ、仮想プライベートゲートウェイの作成をしたのみだったので、一緒にドキュメントなどをみつつ、オンプレ側の設定も必要である点をお伝えしました。

Q: CloudWatch Events -> AWS Lambda という構成で、ある URL 群へリクエストを行う処理をしている。今は一つの Lambda ファンクションで実行しているが、今後処理する量が増えた場合どのような構成を取ればよいか。

Amazon SQS を利用し、URL 群へのアクセス処理を分散処理する方法をご案内しました。

CloudWatch Events -> AWS Lambda(URL ごとにジョブをキューイング) -> Amazon SQS -> AWS Lambda(ジョブに含まれる URL にリクエスト)

Q: AWS CodeDeploy のデプロイで、 AutoScaling グループのスケールアウトの際に 「File already exists at this location」というエラーが出る。

CodeDeploy が、デプロイ先インスタンスに既に同じファイルが存在する場合にデフォルトで返すエラーと思われます。同名のファイルが存在しない AMI を指定するか、デプロイの追加設定で「コンテンツの上書き」を選択することで、これを回避できます。

Q: (続き)予めファイルを削除した AMI でデプロイを実行したが失敗した。

デプロイの実行結果を見ると、hook 処理rake コマンドに失敗して exit 1 が返されていました。hook の異常終了がデプロイ失敗の原因となっていたため、まずはコマンドが正しく終了するよう修正をお願いしました。

Q: Amazon EC2 上に Redash を構築したが、メモリ不足のエラーが出てしまう。

Redash は AWS のサービスでないので、基本的にはお客様ご自身でのトラブルシュートをお願いしました。その上で、ログを確認する、メモリを使っているプロセスを確認する、GitHub Issue に何か関連情報がないか見てみるなど、原因を探していただき、メモリ不足が原因であった場合はインスタンスタイプの変更などをご検討いただくようお願いしました。

Q: 一つの Amazon EC2 上に、Nginx を使って複数の Web サイトを構築している。これを Application Load Balancer(ALB)Amazon Certificate Manager(ACM) で HTTPS 化したところ、HTTPS で A というサイトにアクセスしても B のサイトが表示されてしまう。HTTP でアクセスすると問題なく目的のサイトにアクセスできる。

特に AWS 上の設定には問題なさそうだったため、Nginx の conf の設定や、curl でのアクセス結果(リダイレクトされていないか)などをご確認いただくようお願いしました。

Q: Amazon Aurora のインスタンスクラスをどう選択すればよいか分からない。

アプリケーションの要件やサービスの規模次第になります。インスタンスクラスの特性やスペックを踏まえ、想定される規模の負荷試験を行って適切なタイプを選んでいただくことをおすすめします。

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

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

それではまた次回をお楽しみに!

このブログの著者

塚田 朗弘 (Akihiro Tsukada) @akitsukada

Serverless, Mobile, Blockchain, FinTech Security あたりをよく触っているスタートアップ ソリューションアーキテクトです。そういうネタも書きたい。