🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

660閲覧

AWSを用いた動画を処理するWebアプリケーションのベストプラクティスをご教授ください。

yoshi09japan

総合スコア1

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/02/16 06:39

編集2021/02/16 08:31

実現したいこと

AWS、Webサーバー関連の初心者です。
AWSでユーザーが動画を処理できるWebアプリケーションを作成しています。ベストな実装の流れかどうか不安があります。

いくつかの動画をまとめて、時間のかかる複雑な処理を行う必要があるため、EC2で処理を行おうと思っています。
EC2でのコマンド実行はLambdaを介してSSMで行っています。

具体的な流れとしては次のようになっています。
0. ユーザーはCognitoでユーザー登録。
0. ユーザーは処理したい動画をディレクトリに入れた状態でS3にアップロード。
0. ユーザーがディレクトリを選択してWeb上にある「処理実行ボタン」を押すと、GraphQLで作成したAPIに連動してLambdaが起動。
0. その際に、IdentityIDとディレクトリ名をLambdaに渡す。
0. LambdaはSSMを使用して、IdentityIDとディレクトリ名を引数としてEC2上でコマンド実行。
0. EC2で動画を処理して、結果をS3に返す。
0. ユーザーに処理が終了したことを通知

困っていること

上記の6までは実装できていて、7をどうしたらいいか悩んでいます。
S3の特定フォルダに書き込みがされたら、Webを更新してS3のオブジェクトを表示するにはどうしたらいいのでしょうか?
AWS SNSを使用しようかとも思いましたが、設定が難しそうという印象を持ちました。

また、現在はLambdaを介してEC2を実行していますが、これが一番いい方法なのでしょうか?
Lambdaを使うことで認証フローが楽だったのでLambdaを介していますが、Lambdaの待機時間が15分と短いことが心配です。
Web上で直接SSMを使うのがいいのでしょうか?

何かいい方法がありましたら教えていただけると大変ありがたいです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

S3の特定フォルダに書き込みがされたら、Webを更新してS3のオブジェクトを表示する

正直、この仕様自体がかなり厳しいです。
というのも、クライアントがそれを受け取る方法をどうやって実装するのか、という難題に当たります。
Lambdaの実行時間上限を気にするほど時間のかかる処理を同期的に行うのも現実的ではないと思います。
Lambda以外の部分でタイムアウトが発生する可能性も十分考えられます。
このような処理は通常は非同期で行い、終了時に結果を何らかの手段(メール、プッシュ通知など)で通知してユーザのほうから確認させるほうが現実的でしょう。

そもそもLambdaでのポーリングはあまり良い方法ではありません。ご認識の通り最大実行時間が15分ですし、ただ処理を待機しているだけで課金が発生するので、それであればLambdaでやる意味があまりないでしょう。

ある程度待機時間が必要な場合、StepFunctionsでワークフローを組むのが一つ方法として考えられます。
※参考
[アップデート]Step Functionsの実行ステータスが変化したときにCloudWatchイベントが発行できるようになりました!

ただ、今回は結局Lambdaを使っているのはSSMを使用するところだけなので、EC2上で処理完了時に通知させる、でも十分だと思います。Lambdaを待機させる必要性は特にないかと思います。
SSMのsend commandはどのみち非同期なので待機させるのはかなり面倒です。

いずれにしても処理の通知はSNSで行えばいいと思いますが、通知の仕様次第です。
時間のかかる処理なら終了までユーザを待機させる必要はなくて前述の通り非同期でやればいいとは思いますが。
非同期で行うべき処理を無理に同期的に行わせるよりもSNSを設定するほうが簡単だと自分は思います。
通知をどう実装するかよりも、どのように通知させるかを先に考慮すべきところです。


以下は自分が同様の流れを設計するならこうする、というものです。必ずしも正解ではありませんし、うまく行かない部分があるかもしれません。

  1. Cognitoユーザプールを作成し、アプリと連携させる
  2. S3に、ユーザごとに固有のパスを参照できるような権限でバケットを作る

参考:Amazon S3: Amazon Cognito ユーザーにバケット内のオブジェクトへのアクセスを許可する
[素朴な手順]CognitoでIdentityID別にS3バケットへのアクセス許可をつけてみます

  1. アプリを経由して、ユーザ固有のパスに動画をアップロードさせる
  2. ユーザの操作をトリガーにAPIにリクエストを送り、処理を開始させる

処理実行は色んな方法が考えられますが、AWS Batchを実行させても、EC2上で実行させても、Step Functionsを使ってもいかようにでもなるとは思います。
ただ、できればオンデマンドのEC2インスタンスではなく少なくともスポットインスタンスを使いたいですね。
アクセスが多いようならSQSと連携させてさらに非同期にしてもいいでしょう。

  1. 処理完了時にS3にアップロード。処理の最後に通知。

通知はSNSで設定。プッシュ通知なのか、SESと連携させてメールなのか。
S3へのアップロードイベントをトリガーにする必要はあまりないと思っています。

あくまで一例として、参考までに。

投稿2021/02/16 15:18

yu_1985

総合スコア7588

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshi09japan

2021/02/17 05:24

yu_1985さん とても分かりやすくご回答していただき、ありがとうございます。1人ですべてをやっていて相談できる人がいないため、大変助かりました。 4.AWS BatchがEC2をスケーラブルに使用できそうでよさそうなので、AWS Batchを使ってみます。 5.EC2でのコマンド終了時にAWS SNSかSESを使って通知することにします。 SNSのメールだとメッセージを入れることができないようなので、SESを使ってみようと思います。 もうひとつ教えていただきたいのですが、SESは実際の運用ではサンドボックスを外して使うということですが、Cognitoで認証したEmailを自動で認証してサンドボックス内で使用するといった方法(ポリシーのアタッチ?)はあるのでしょうか?
yu_1985

2021/02/17 06:07

そのような方法を考えたことがないのでわかりません。 サンドボックス内でなければいけない理由があるということですか? できないことはないかもしれませんが、サンドボックス内のみで利用することは検証以外の用途ではオススメしません。 利用者のドメインが固定されているのであれば、ドメインの認証が済んでいれば同じドメインのメールアドレスには送ることは一応できます。
yoshi09japan

2021/02/18 00:39

テストユーザーに対して、メールアドレスを登録したあとに認証してもらうという手間を避けたかったのですが、やってもらうのがよさそうですね。 分かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問