AWS Startup ブログ

【週刊 Ask An Expert #14】簡単に Docker を動かしたい?まずは AWS Fargate でいかがでしょう。AWS Loft Tokyo で受けた質問まとめ #AWSLoft

こんにちは、スタートアップ ソリューションアーキテクトの塚田 (Twitter: @akitsukada) です。好きな AWS サービスは AWS Amplify です。8/8(木) 19:00、Amplify & Chalice のハンズオンワークショップを開催するので、アプリケーションデベロッパーの方や、楽してさくっとサービスを構築したい方はぜひ Loft にお越しください。

怠惰はプログラマの三大美徳の一つ。Let’s be lazy together.

さて、今回の週刊 Ask An Expert 第14回目をお届けします。「参考になったわ!」「ええ内容や!」と思っていただけたら、ぜひハッシュタグ #AWSLoft を付けてシェアしてください。もちろん、改善点・ご要望もお待ちしております。

Ask An Expert ?

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

ある日の和やかなエキスパートたち、CSE 古野(写真左)と SA 岩野(右)

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

週刊 Ask An Expert #14 (2019/07/16 – 07/19)

この週の対応者は SA: 浅野・松田・濵・福嶋・水馬と CSE: 古野・嶋本・榎本でした。

Q: AWS Direct Connect でプライベートな接続を敷くことを考えているが、バックアップに VPN を用意しておくなど冗長化したほうがよいか。どう設定すればよいか。

はい、Direct Connect と VPN の併用は冗長化のための一つのアーキテクチャパターンであり、下記の資料でも紹介しています(55ページ)。

まだ BGP に関する設定などされておらず、詳細な手順をその場で全てご案内することが難しく、お客様は AWS サポートに加入されていたため、続きはサポートにお問い合わせいただければご案内できることをお伝えしました。

Q: TableauAmazon Redshift を連携している。クエリ高速化のため、一部のユーザーが Redshift 内に一時テーブルを作ることを考えているんだけど、どうですかね?

色々ディスカッションさせていただき、そもそも定期的に使うのであれば一時テーブルでなくちゃんとテーブルを作っておく方が良いのではないだろうか、という流れになりました。また、Redshift のパフォーマンスチューニングテクニックは次の資料にまとまっているのでご覧ください。

Q: AWS Lambda の稼働状況をモニタリングするにはどうすればよいか?

Amazon CloudWatch メトリクスや CloudWatch Logs のログをご確認いただけます。その他の Tips を含む実践的なモニタリングテクニックについては次の資料をご覧ください。

Q: Amazon API Gateway にアクセス制御をかけたい。

次の資料をベースに、API Gateway のリソースポリシーやオーソライザーについてご案内しました。お話を伺ったところ「Cognito User Pools でサインイン済みのユーザーのみにアクセスを許可したい」とのことだったので、今回は Cognito Authorizer が向いていそうでした。

Q: Amazon API Gateway と AWS Lambda で API を構築するとき、任意の HTTP ステータスコードをレスポンスする方法は?

API Gateway で Lambda プロキシ統合を設定すると、Lambda 関数の出力に {"statusCode": httpStatusCode} を含められます。

Q: Amazon DynamoDB でテーブルが増えて、分かりにくくなってきた。効率のよい管理方法はないか。

DynamoDB は、複数テーブルをまとめるテーブルグループ機能を提供しているのでご利用ください。

Q: マルチリージョンでサービス展開するため、Amazon DynamoDB でグローバルテーブルを利用している。元テーブルで暗号化設定に「デフォルト」を選んでいた場合、レプリケーション先はどうなるか?

レプリケーション先でも「デフォルト」の暗号化が設定されます。もし元テーブルで AWS Key Management Service (KMS) による暗号化を設定していた場合は、レプリケーション先リージョンの AWS KMS にも同じエイリアスを持つ CMK が自動で作成され、テーブルの暗号化に使われます。

Q: AWS の運用保守を別会社に依頼しているが、もう少し自分たちでも確認したくなることがある。

まずはリードオンリーな AWS IAM ユーザーを作るなどして、試してみるのはいかがでしょう。

Q: Microsoft Word などの Office ファイルを共有したいのだが、何かよいサービスはないか。

ぜひ Amazon WorkDocs をお試しください。

Q: Web サービスのバックエンドを設計したのだが、スケールに耐えられるアーキテクチャなのかレビューしてほしい。また、なるべく安くしたい。

拝見し、以下の点をお伝えしました。

  • Amazon EC2 は Auto Scaling Group を使って、複数 Availability Zone に冗長化することをおすすめ。
  • Amazon Aurora も Multi-AZ 構成を推奨します。
  • コストについては、
    • スポットインスタンスを使ったり、ずっと起動するインスタンスならリザーブドインスタンス(EC2 / Aurora・RDS)を購入して節約できます。
    • 開発環境は、必要なタイミング以外は稼働停止する、スペックを低くするなどが考えられます。ただし、負荷試験のタイミングでは、本番と同等のスペックにした上でテストをしていただくことをおすすめします。
  • AWS Systems MangerSession Manager を使うことで、踏み台サーバーを無くせるのではないでしょうか。

Q: メール送信処理に Amazon Simple Email Service (SES) を使っているが、バウンス率が上がっているみたい。何かしたほうがよい?

はい!バウンスを正しく処理しないまま放置すると、メールの送信を止めさせていただく場合があるので対応をお願いします。例えば Amazon SNS を使ってバウンスメールの発生をキャッチし、対処することができます。以下の資料50ページからをご参照ください。

Q: Amazon SES で、サプレッションリストからの E メールアドレス削除はマネジメントコンソールで操作可能か?

はい、SES のマネジメントコンソールで削除できます。

Q: 他社 VPS を利用中だが、Amazon EC2Amazon Lightsail に移行したい。どちらがよいか?

現在 VPS をお使いとのことなので、そのままシンプルな VPS を利用したいのであれば、ある程度パッケージ化もされている Lightsail がおすすめです。より柔軟な設定が必要な場合は EC2 がよいでしょう。以下の資料 14 ページを御覧ください。

Q: 本番環境で利用している Amazon Aurora for MySQLAmazon DynamoDB に、機械学習チームからもアクセスできる様にしたい。AWS Glue を使って Amazon S3 に csv をダンプしてみたが、もう少し手軽にデータを共有する様なやり方は無いか?

Glueを利用しないパターンとして、スナップショットの共有データベースのクローンAWS Database Migration Service(DMS) 経由で S3 に出す、DynamoDB Streams を使って別テーブルにコピーを取るなどの手段についてディスカッションしました。また、データの共有先は別の AWS アカウントになるという事だったので、VPC Peering や IAM ポリシーの書き方などをご紹介しました。

Q: Ruby on Rails でアプリを作っている。Amazon RDS で作成した開発用データベースに、色々な開発者の Laptop からアクセスしたい。

RDSのパブリックアクセスのやり方と注意点をご案内。お手軽なやり方として SSH Port Forading などがあり、Session Manager を使って踏み台サーバーなど無しで実現することができます。

Q: CISCO の Adaptive Security Virtual Appliance (ASAv) を試してみているのだが、NIC を2枚にするとどうにも動かない。。

AWS としては Elastic Network Interface(ENI) の追加方法と注意事項をご案内しましたが、インスタンスにアタッチされた ENI をどの様に取り扱うかは ASAv 側の問題なので、CISCO のドキュメント・サポート経由で確認して欲しいとガイドしました。お話を伺っていると、2枚NICにすると EC2 の Status チェックが 1/2 になる模様。 1/2 の状況ということは、IP 的なリーチャビリティが無い状態であるため、やはり OS レイヤー以上でなんらかの作業が必要になる or 何か問題が起こっている可能性があることを説明しました。

Q: (続き) EC2 インスタンスに複数の ENI を生やそうとするとエラーになってしまう。

ENI が作成できていませんでした。

Q: (続き) ENI の設定にある Source/Destination Check(送信元/送信先チェック) とは何か?

ENI がアタッチされたインスタンスが送信元でも送信先でもない通信を許可するかどうか(チェックする = 許可しない)です。通常のサーバーであればデフォルトでチェックしていればよいですが、NAT や Firewall、ルーターなど、自身が送信元にも送信先にも該当しない通信を扱うインスタンスである場合はチェックを無効にする必要があります。

Q: Web API を作りたい。現在 Amazon EC2 上で Docker を動かしており、ELB の Cognito 認証機能を使おうと思っている。今後は Serverless にすることも考えている。

EC2 上で Docker をホストするなら、AWS FargateAmazon ECSAmazon EKS などのマネージドサービスを利用したほうがよさそうです。まずは EC2 インスタンスの管理が不要になる Fargate を触ってみることをおすすめしました。

Q: フォロー・フォロワー関係のあるソーシャルアプリを作りたい。DB として DynamoDB と Relational DB のどちらがよいか。

どちらでも実現はできると思われますが、サービス規模、アクセスパターン、重視する要件等、様々な条件次第で判断は異なってくるため、一概には言えません。また、いずれにしてもデータ設計をしっかり行う必要があります。あらかじめデータ構造を洗い出す・モデリングすることが難しい場合は、一つの進め方の例として、まずはスキーマを考えずに NoSQL で開発を進めてみて、ある程度クエリ特性やデータベースに求める要件が分かってきたら改めて適した DB を選ぶ、というのはどうでしょうか。

Q: Amazon Aurora を開発で使っているが、コストを抑えるにはどうすればよいか。

夜間・土日は不要だったりする開発環境用途であれば、Aurora Serverless にしてコスト効率を上げるのが有効そうです。

Q: Amazon EC2 上で WordPress を運用したく、アーキテクチャを設計している。レビューしてほしい。

静的コンテンツについては、WordPress のプラグイン等で Amazon S3 でホストし、Amazon CloudFront を通して配信することでスケーラビリティ等の向上が望めます。静的コンテンツだけでなく、WordPressサーバーから返すコンテンツでも、Read メインなもの(記事の閲覧ページなど)は CloudFront でキャッシュしてしまうとよいでしょう。

ELB と EC2 が両方とも Public Subnet に置かれる想定になっていますが、ELB だけを Internet Facing にし、EC2 は Private Subnet に置くことで、不要な露出が減りセキュリティが高まります。

Q: サードパーティの DNS サービスでドメインを管理しているが、独自ドメインを ALB に名前解決させることは可能か。

CNAME レコードを ALB の DNS Name (A レコード値)に向けることで可能ですが、要件をお伺いしたところ Zone Apex (トップレベルドメイン)でのアクセスをしたいとのことでしたので、Amazon Route 53 の ALIAS レコード機能を使う必要がありそうでした。Route 53 を DNS サービスとして使う方法をご案内しました。

Q: サードパーティのドメイン登録業者でドメインを取っていて、メールの送受信に他社クラウドを使用している。この送受信を Amazon SES に乗り換えたいが、設定が理解できず困っている。

SMTP / POP / メールクライアントの関係を説明しました。EC2 からの送信時には他社クラウド上の SMTP サーバを指定していたので、それを SES の SMTP サーバに変更すればよさそうでした。受信には SES のメール受信機能も使えますが、 Amazon WorkMail を使用すると便利ですよ。

Q: 一日あたり40万件程度の速度で Item が増える Amazon DynamoDB の、テーブル設計レビューをしてほしい。

拝見したところ、パーティションキー、ソートキー、GSIの設計については問題なさそうでした。

一部フルスキャンに近い集計要件があったため、オンラインな処理が不要なものは S3 にデータを配置し、Amazon RedshiftAmazon Athena で集計していただく方が良い可能性があるとご案内しました。

Q: 現在構築している Amazon API Gateway と AWS Lambda のサーバーレスアプリケーションで、 AWS Lambda の Duration がたまに上昇することがあるが、これはコールドスタートの影響か?

いいえ、コールドスタートの時間は Duration に含まれないため、Lambda 関数内の処理に時間がかかっていることを示しています(コールドスタートであれば、Lambda の Duration Time でなく API Gateway の IntegrationLatency が上昇します)。
可能性がありそうな処理で処理時間を出力するなどして、遅い箇所を特定して切り分けていくことをおすすめしました。また、AWS X-Ray を使ってトレースし、時間のかかる処理を可視化することもご案内しました。

Q: Amazon ECS, AWS Fargate を利用したときの CI/CD について、おすすめの方法を教えて欲しい

AWS CodePipeline を使い、パイプラインを管理します。ビルドステージでは AWS CodeBuild 上で docker build を走らせてイメージを作成し、Amazon ECRdocker push。デプロイステージでデプロイ先に Amazon ECS を選択する、など。こちらのチュートリアルが参考になるかと思います。

さらに、AWS CodeDeploy を使って Amazon ECS に Blue/Green デプロイを行う方法もあります。それについてはこちらの手順をご参照ください。

Q: AWS Lambda から Amazon Cognito User PoolsAdminInitiateAuth API がうまく呼べないが、原因がわからない。

コードとログを拝見したところ例外を握りつぶしていたため、例外メッセージを出力してみると AWS IAM の権限不足でした。Lambda ファンクションの実行ロールに、AdminInitiateAuth API の呼び出しを許可するポリシーを追加したところ正しく動作しました。

Q: AWS Amplify で Android アプリを開発している。Amazon Cognito によるサインイン機能をつけているが、しばらくするとサインアウトしてしまう。

Refresh Token によるトークンリフレッシュがされていない可能性が疑われたため、実装の確認をお願いしました。

Q: Amazon S3 バケットにオブジェクトをアップロードしたはずだが、アップロード済みのオブジェクトを確認できない。

S3 バケットに対するアクセスログを同じバケット直下に出力していたため、ログファイルが無限に出力され続けており、アップロードされたオブジェクトがどれか分からない(判別しにくい)状態になってしまっていました。オブジェクトのアップロードは別の担当者が行っており、具体的なオブジェクト名が分からないということだったので、オブジェクト名を確認いただくか、もう一度アップロードを行ってみてはとお伝えしました。
併せて、ログファイルが繰り返し出力されてしまう問題へ対処するために、ログは別の S3 バケットへ出力することと、既存のログファイルはライフサイクルで削除することをご提案しました。

Q: S3 バケットに対するライフサイクル設定について教えてほしい。一定期間が経過したオブジェクトを削除したい。

バージョニングが有効化されていたため、オブジェクトバージョンの削除を元に設定方法をご案内しました。

Q: S3 バケットに対してオンプレミスのサーバーから curl でオブジェクトをアップロードし、Lambda でオブジェクトを処理している。現状は匿名ユーザーで S3 バケットにオブジェクトをアップロードしているため、バケットの所有アカウントとオブジェクトの所有アカウントが一致していない。このため、Lambda Function にアタッチされた IAM Role にポリシーを追加するだけではオブジェクトにアクセスできず、やむなくバケットポリシーでパブリックアクセスを許可している。どのようにセキュリティを担保していけばよいか。

短期的な対策として、AWS Blog の バケットポリシーで特定 IAM Role からのアクセスを許可する が効果的と考えられるため紹介させていただきました。
合わせて、最終的には curl ではなく AWS CLI もしくは AWS SDK をご利用の上、署名付きリクエストで S3 バケットにオブジェクトをアップロードする方向でアプリケーションを改修することをお勧めいたしました。

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

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

このブログの著者

塚田 朗弘(Akihiro Tsukada)
スタートアップソリューションアーキテクト。好きなサービスは AWS Amplify、AWS AppSync、Amazon Pinpoint。趣味は頭を触ってくる子供と遊ぶこと。