サーバレスなVOD配信環境を構築


AWS Media Blog の  [Creating a secure video-on-demand (VOD) platform using AWS](https://aws.amazon.com/jp/blogs/media/creating-a-secure-video-on-demand-vod-platform-using-aws/) の記事で紹介されていた [download this detailed lab guide](https://testorlando1.s3.amazonaws.com/VOD-Blog-LabGuide.docx)を参考にサーバレスなVOD配信環境を構築してみました。

# サーバレスなVOD配信環境でできること

認証されたユーザーのみが動画をアップロード、処理、配信および閲覧可能なサーバレスのVODストリーミングプラットフォームです。

## ■動画アップロード画面(管理者権限付与ユーザのみログイン可能)

### ログイン

![Adminログイン画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/b9cb3ca1-da98-7ae1-7fd5-860830916847.png)

### 動画アップロード

![Adminファイルアップロード画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/14fecd76-3c4e-75b3-760d-334189f51e3c.png)

## ■動画配信画面（認証済ユーザのみ）

### ログイン

![Guestログイン画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/dfe635eb-fe78-aa9a-611f-21e68ae4831b.png)

### 動画一覧

![Guest動画一覧画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e5d895e3-f461-8fcf-742f-1f4c34e64023.png)

### 動画配信

![Guest動画閲覧画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/26e9d8de-9800-a05e-9947-cd9e1e056991.png)


# サーバレスなVOD配信環境のアーキテクチャ

## ■概要

![アーキテクチャ概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/9594fd3a-eef4-8d5e-19ee-294a4df99f8a.png)

## ■説明

```ruby:DeepL翻訳
このサーバーレスVODワークフローソリューションは、
Amazon Cognito、AWS AppSync、Amazon S3、AWS Lambda、Amazon DynamoDB、AWS Secrets Manager、
AWS Elemental MediaConvert、Amazon CloudFront、AWS Amplify、AWS CloudFormation
を含む複数のAWSサービスを利用して構築されています。

このソリューションでは、CognitoはGraphQL APIへのアクセスを保護するCognito User Poolsを介してWebアプリケーションのユーザーを認証します。
APIはCognito User Pool内のグループに基づいたきめ細かなアクセスが可能です。
また、Cognitoは、コンテンツをS3にアップロードするためのアクセスのために、一時的に限定された特権を持つAWSのクレデンシャルを生成しています。

GraphQL APIを利用したAppSyncでは、クライアントアプリがサーバーからデータをフェッチ、変更、サブスクライブできるようにしています。
今回のソリューションでは、GraphQL APIを利用して動画に対してCRUD（Create/Read/Update/Delete）操作を行い、動画をS3バケットに格納しています。

このワークフローでは、2つのS3バケットを使用しています。
1つは生の動画を保存するため、もう1つは異なる出力フォーマットとビットレートの動画を保存するためです。

複数の Lambda 関数は、

MediaConvert ジョブのトリガー、
DynamoDB へのメタデータの保存、
署名付き URL トークンの作成、
MediaConvert ジョブの終了時の通知の送信

など、さまざまな目的に使用されます。

MediaConvert はアップロードされた動画を 
2 Mbps
1 Mpbs
600 Kbps
400 Kbps 
の HLS 形式で自動的にトランスコードします。
ビデオコンテンツは、さまざまなネットワーク帯域幅接続を持つ複数のデバイスで再生できるように、適応ビットレートのストリームとしてエンコードされます。

Secrets Managerは、CloudFrontの秘密鍵を安全に保存し、CloudFrontのURLに署名するために使用します。
CloudFrontは、実行時にアプリケーションを介してCDN Edgeのロケーションを介して、許可されたユーザーにコンテンツを安全に配信します。

その他の設定情報

・Signed Cookies/URLs
CloudFrontが各URLの有効期限、許可されたIPアドレス、FileNameを設定できるようにします。
デフォルトでは、CDNで配布されたコンテンツにはNo Readアクセスが割り当てられています。
コンテンツは、アプリが生成した適切なSigned Cookieを使用してリクエストされた場合にのみダウンロードしてアクセスすることができます。
・S3 CORSの設定
S3/CDN経由でコンテンツへのアクセスを許可するウェブサイトを設定します。S3 CORS設定の詳細については、こちらのブログ記事をご覧ください。

AmplifyとCloudFormationは、ソリューションのバックエンドに関わるリソースやサービスの迅速な展開を容易にします。
```

# サーバレスなVOD配信環境を構築する

## ■公式ドキュメント

[VOD-Blog-LabGuide](https://testorlando1.s3.amazonaws.com/VOD-Blog-LabGuide.docx) ※Wordファイル(docx)

## ■前提条件

### AWSアカウント

- IAMユーザでAWSマネジメントコンソールにログイン（step4以外)
    - IAMユーザ名：vodaws
    - IAMポリシー：AdministratorAccess
- ルートアカウントでAWSマネジメントコンソールにログイン（step4のみ)

### AWSマネジメントコンソール
 
- 言語
    - 日本語
- リージョン
    - ap-northeast-1 (Tokyo) 


## ■Step1: Setting up Development Environme

### 1. AWS Cloud9コンソールに移動後、【 Create environment 】を選択

![snip_20200622192939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/c64b757c-0a59-572f-5715-faf8ff85b042.png)
※Regionが東京である事を再確認


### 2.  Name environment の設定後、【Next step 】を選択

Name: VodAws
Description： This environment is for the AWS Cloud9 tutorial.

![snip_20200622193628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/a4064dee-0091-a165-6d79-b4e87c30a8d8.png)

### 3. Environment setting にて t3.smallを選択後、【Next step 】を選択 ※インスタンスタイプ以外はデフォルト

![snip_20200622193816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/97a11fe6-b182-3aa4-4654-9b95c307e13f.png)

### 4. 設定内容を確認後、【 Create environment 】を選択

![snip_20200622194231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/932da04b-0c14-b299-16d2-9fa425f04c58.png)

### 5. Welcomeタブ横の(+) を選択し、別タブの新規ターミナルを表示

![snip_20200622194351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/f57feca7-c92a-cb0c-0d0d-6fa375dac6d3.png)


## ■Step2: Installing Packages and Configuring Environment

### 1. 以下のコマンドを実行してcredentialsファイルをコピー

```ruby:コマンド
cp ~/.aws/credentials ~/.aws/config
```

![snip_20200622194813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/08785b07-7775-c43e-b654-4bbeb6ebec9f.png)

### 2.以下のコマンドを実行してAmplify CLIをインストール

```ruby:コマンド
npm install -g @aws-amplify/cli
```

![snip_20200622194905.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/c546c793-db84-86f1-154e-53307a2a19df.png)

インストール時にWARNが表示されますが今回は無視します。

![snip_20200622195111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/7c5a09f0-a6b2-9e7c-4fc4-9bf0546e0e3b.png)

### 3. 以下のコマンドを実行してVodAws.zipをダウンロード

```ruby:コマンド
wget https://testorlando1.s3.amazonaws.com/VodAws.zip
```

![snip_20200622195319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/065e43e4-6fd6-765f-c8b6-caf17361eed4.png)

### 4. 以下のコマンドを実行してVodAws.zipを解凍

```ruby:コマンド
unzip VodAws.zip
```

![snip_20200622195445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/5ae8c22b-98c2-4e49-ec2a-2e044e6f76fd.png)

### 5. 以下のコマンドを実行してVodAwsディレクトへ移動

```ruby:コマンド
cd VodAws
```

![snip_20200622195708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/21255adf-0e13-e1b3-e3da-1f727ae675d9.png)

### 5. 以下のコマンドを実行してNPMをインストール

```ruby:コマンド
npm install
```

![snip_20200622195847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/2c43d558-5352-52b3-1f30-d2a9107af171.png)

インストール時にWARNが表示されますが今回は無視します。

![snip_20200622200031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/2117e2d0-d3e6-6c91-c850-7eb7602c0416.png)

## ■Step3: Deploying Backend using Amplify Cli 

### 1. 以下のコマンドを実行して~/environment/VodAwsにいることを確認

```ruby:コマンド
pwd
```

![snip_20200622200550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/987a16f1-c833-ebcd-58b6-ade93bd9ed16.png)


### 2. 以下のコマンドを実行してAWSバックエンドのセットアップ

```ruby:コマンド
amplify init
```

![snip_20200622200633.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/9fa3e62c-c3a8-f544-285b-6f0c6f076c6f.png)

プロンプトの選択については下記のとおり。

プロジェクト名を入力
![snip_20200622202340.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/8c9ca82c-4e58-e3ef-a795-5fe43d6fdf37.png)

環境を入力
![snip_20200622202535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/4515a19d-4fcd-c22e-87e4-d201fdb74231.png)

使用するエディタを選択
![snip_20200622202558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/8b0d191a-e8fe-a141-014e-dd343c4e90cb.png)

対象アプリの種類を選択
![snip_20200622202648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/574a1d23-1475-9ece-cd31-e071364667d3.png)

使用するJavaScriptフレームワークを選択
![snip_20200622202715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/285f43ab-df57-c3ce-12e0-c6261eadd572.png)

プロジェクト内のソースディレクトリパスの場所を指定
![snip_20200622202753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/13696e5d-9c40-3eb6-c681-6b8f04982404.png)

配布用ディレクトリパスの場所を指定
![snip_20200622203006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/c6bd417a-30d1-11ac-697c-a826a60be47e.png)

ビルドコマンドを入力
![snip_20200622203032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/b442ac60-29e8-4006-13a7-05bb87bc28a7.png)

スタートコマンドを入力
![snip_20200622203226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/5d590efb-463d-604d-5faf-6bd0da645b9e.png)

AWSプロファイルを使用
![snip_20200622203248.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/1d82cffc-b5a4-fe33-6223-0e2c170c9096.png)

defaultのAWSプロファイルを使用
![snip_20200622203315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/082c63c7-92b0-69a6-786f-a37277e08e57.png)


上記選択後、バックグラウンドで処理が走ります。

![snip_20200622203431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/0aff4fbf-bab2-ebd0-ecd5-3e4caf2873cd.png)


### 3. 以下のコマンドを実行してプロジェクトにAPIモジュールを追加

```ruby:コマンド
amplify add api
```

![snip_20200622204536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/6c76f189-fbd1-278d-2751-52b6e0e3ceda.png)

プロンプトの選択については下記のとおり。

サービスを選択
![snip_20200622204619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/4b02e78d-b04e-e833-7abe-51465bd25418.png)

API名を入力
![snip_20200622204654.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/bfffc18a-ac87-8d04-bc99-11b05ee019e5.png)

認証形式を選択
![snip_20200622204725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/038373c9-9b15-5a11-c8e1-543864dd5556.png)

デフォルトの認証とセキュリティ設定利用有無を選択
![snip_20200622204834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/696ddd6c-5662-8b82-b6e5-18559630f586.png)

サインイン手段の選択
![snip_20200622204904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/a09fbe7a-a965-3ff3-cdbc-2401e914fd95.png)

追加設定の選択
![snip_20200622204928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/0dd428ad-b3e8-cf8b-2815-af8e34e3edde.png)

GraphQL API追加設定の選択
![snip_20200622205037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/a9269f17-f621-0f12-c25a-714ec5cb8ee7.png)

既存GraphQLスキーマ利用有無の選択
![snip_20200622205213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/753ad411-99ab-585b-684d-d10bb35e48ec.png)

ガイド付きGraphQLスキーマ作成有無の選択
![snip_20200622210023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/8fc24f73-1065-d5a1-e4ab-8697824c8a4a.png)

最も合致する使用方法の選択
![snip_20200622205304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/7da8e5cb-58f2-d35b-c4e7-32b232bec21a.png)

スキーマ作成を今すぐ行うかどうかの選択
![snip_20200622205328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/88d237d8-66e6-5574-ff19-073e5a649c67.png)


上記選択後、APIモジュール追加処理。

![snip_20200622205412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/4b7aeced-e4b5-808d-ec0d-f94a3c406b88.png)

### 4. 以下のコマンドを実行してschema.graphql を編集

```ruby:コマンド
cat << EOF > /home/ec2-user/environment/VodAws/amplify/backend/api/vodaws/schema.graphql

type vodAsset @model (subscriptions: {level: public})
@auth(
  rules: [
    {allow: groups, groups:["Admin"], operations: [create, update, delete, read]},
    {allow: private, operations: [read]}
  ]
)
{
  id:ID!
  title:String!
  description:String!

  #DO NOT EDIT
  video:videoObject @connection
}

#DO NOT EDIT
type videoObject @model
@auth(
  rules: [
    {allow: groups, groups:["Admin"], operations: [create, update, delete, read]},
    {allow: private, operations: [read]}
  ]
)
{
  id:ID!
  token: String @function(name: "VodAws-prod-tokenGen")
}
EOF
```

![snip_20200622211751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/08dbe761-abfd-8699-ea77-bd7228d62a5e.png)

### 5. 以下のコマンドを実行してデプロイを実行

```ruby:コマンド
amplify push
※continue?についてはYを選択
```

![snip_20200622212509.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/2758e719-4c6a-9a98-327a-697d5fe6d9a6.png)

プロンプトの選択については下記のとおり。

Query/Mutationのコード生成有無

![snip_20200622212546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/9f7f1edb-da86-4f8d-6529-1c4b812efa7b.png)

生成するコードの言語の選択

![snip_20200622212618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/50872b41-f64c-2ee4-cc9b-02823aa2da85.png)

ファイル名のパターン(queries, mutations, subscriptions)の入力

![snip_20200622212700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/0399f3fd-e585-02b5-0d9e-4846cf872600.png)

全てのGraphQLの操作に対してのコード生成有無

![snip_20200622212744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/18a5926d-ca6e-5a86-27d5-044b2a430f82.png)

タイプ同士で相互参照している場合のネストの最大値

![snip_20200622212806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/962e4b71-f314-ca1a-c339-06e1fe5e1a40.png)

上記選択後、デプロイ実行

![snip_20200622212923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/998f4980-7bf8-dd83-572a-d484ce62c1f4.png)

### 6. ブラウザの別タブよりCloudFormationダッシュボードへ移動

CloudFormationダッシュボードへ移動

![snip_20200623010412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/0d7c224d-6cc5-16fe-f6e3-3a33b12c32c4.png)


ネスト表示に切り替え

![snip_20200623010551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e6eeb0c0-026d-4d3e-1593-cdd5739358f0.png)


### 7. amplify-vodaws-prod-*のスタック名を選択後、出力に表示されている値(赤丸の個所)をメモ帳等に控える

![snip_20200623011219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/d42b9478-360c-96bd-17d6-e7f1f9cbc08b.png)

### 8. amplify-vodaws-prod-*-authvodaws*****のスタック名を選択後、出力に表示されている値(赤丸の個所)をメモ帳等に控える

![snip_20200623012252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e9e59b61-f349-8ad2-c2d4-fd4738278a96.png)

## ■Step4: Creating CloudFront Key Pairs

```ruby:DeepL翻訳
重要
IAMユーザーはCloudFrontのキーペアを作成することができません。キーペアを作成するには、ルート資格情報を使用してログインする必要があります
```

### 1. 別ブラウザを開き、ルートアカウントでAWSマネジメントコンソールにログイン

![snip_20200623102627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/1925e3c1-2b13-ad5c-bd57-c53cfa133c52.png)

### 2. 画面右上のアカウント名をクリック後、【 マイセキュリティ資格情報 】を選択

![snip_20200623103147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/83fd0ab9-9ae3-be2e-501a-83b9c7fd4eda.png)

### 3. セキュリティ認証画面の【 新しいキーペアの作成 】を選択

![snip_20200623103447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/01f8665c-a1f4-80bc-3f27-69111dcd2494.png)

### 4. 【 プライベートキーファイルのダウンロード 】を選択してローカルにダウンロード

![snip_20200623103606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/cced515b-c5b6-6e38-0ccd-3fa1b6957a91.png)

```ruby:DeepL翻訳
重要
CloudFrontのキーペアの秘密鍵を安全な場所に保存し、希望する管理者のみが読めるようにファイルのパーミッションを設定します。
誰かがあなたの秘密鍵を取得すると、有効な署名付きURLや署名付きクッキーを生成して、あなたのコンテンツをダウンロードすることができます。
秘密鍵は二度と取得できないので、紛失したり削除したりした場合は、新たにCloudFrontの鍵ペアを作成する必要があります
```

### 5. 出力に表示されているアクセスキーID(赤丸の個所)をメモ帳等に控える（署名付きURLや署名付きCooki作成に利用）

![snip_20200623104835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/af4c247c-79f7-eac6-dab7-eaa91d78221f.png)

**以降はルートアカウントによる作業は発生しない為、 ルートアカウントでログインしているAWSマネジメントコンソールについてはログアウト**

## ■Step5: Storing CloudFront Key Pairs

**Step5以降はStep3にて使用したAWSマネジメントコンソール(IAMユーザログイン)を使用**

### 1. Step3にて使用したCloud9のターミナルよりを以下のコマンドを実行してStep4の3のプライベートキーファイルをコピー

```ruby:コマンド
cat /home/ec2-user/environment/privateKey.pem
※ファイルが存在しないことを確認

cat << EOF > /home/ec2-user/environment/privateKey.pem
(Step4の3のプライベートキーファイルの内容)
EOF
```

![snip_20200623144840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/1d39e1c9-9cef-97bf-1432-1cde633a9977.png)

## ■Step6: Storing Private key using AWS SecretsManager

### 1. 以下のコマンドを実行して秘密鍵をSecretsManagerに保存後、出力に表示されている値(赤丸の個所)をメモ帳等に控える

```ruby:コマンド
aws secretsmanager create-secret --name VodAws --secret-binary file://privateKey.pem
```

![snip_20200623143705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/eef3e101-41bd-321c-ff08-1c0061d0cb11.png)

## ■Step 7: Verify the values of all the variables

### 1. 以下の変数の値を控えていることを確認

| 変数名| 値| 
|:-----------------|:-----------------|
| pAppClientID | Step 3 の8のAppClientID| 
| pAppClientIDWeb | Step 3 の8のAppClientIDWeb| 
| pAuthRoleArn | Step 3 の7のAuthRoleArn| 
| pIdentityPoolID | Step 3の8のIdentityPoolID | 
| pPemID | Step 4 の5のアクセスID| 
| pS3 | Step 3 の7のDeploymentBucketName| 
| pSecretPem | Step 6 の1のName| 
| pSecretPemArn | Step 6 の1のARN| 
| pSourceFolder | vod-helpers  (規定値)| 
| pUnAuthRoleArn | Step 3 の7のUnAuthRoleArn| 
| pUserPoolID | Step 3の8のUserPoolId| 
| pAuthRoleName | Step 3 の7のAuthRoleName| 
| penv | prod   (規定値)| 
| pUnAuthRoleName| Step 3 の7のUnAuthRoleName| 

## ■Step8: Deploying CloudFormation Template

### 1. vod-helpers.zipをローカルにダウンロードの上、解凍（vod-helpersフォルダ）

ダウンロード先URL：https://testorlando1.s3.amazonaws.com/vod-helpers.zip

### 2. 別タブにてS3ダッシュボードに移動

![snip_20200623115628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/8a823d83-7e53-fe96-fd15-2c12ef367bac.png)

### 3. amplify-vodaws-prod-***-deploymentを選択

![snip_20200623115825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e200771b-06dd-282c-137c-79692c97777a.png)

### 4. 1のvod-helpersフォルダをアップロード画面にドラックアンドドロップ後、【アップロード】を選択

![snip_20200623150256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/67aeb062-18cb-72ff-29aa-9f9c49503576.png)


### 5. vod-helpersを選択後、【アクション】より【公開する】を選択

![snip_20200623120144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/bacc3cb7-8b3b-3aa9-fb19-f0ebb51555a1.png)

### 6. 【公開する】を選択

![snip_20200623120318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/f580acb0-96c6-6c34-21fb-9cc4ab9dbb7d.png)

### 7. Launch with CloudFormation Console のリンクを別タブで表示

**Launch with CloudFormation Console**
https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?templateURL=https:%2F%2Fs3.amazonaws.com%2Ftestorlando1%2FParentStack.json&stackName=VodAwsStack
※引数のregionをap-northeast-1に変更しています

### 8. スタックのクイック作成が開いたことを確認

![snip_20200623120931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/ea125178-faa0-bdcb-f610-4a41ef47e2d5.png)


### 9. パラメータの空欄にStep 7の1で控えた値を入力

![snip_20200623121906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/ab983092-ded6-19a0-ff2f-2279596b94a2.png)


### 10. 機能のチェックボックスにチェック後、【 スタックの作成 】を選択

![snip_20200623122138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/65eb5594-b632-3a49-3133-2eee438fe4bd.png)

### 11. VodAwsStackのスタック名を選択後、出力に表示されている値(赤丸の個所)をメモ帳等に控える

![snip_20200623122835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/9c52b28a-9cab-8d58-bd1d-5a3026fb85e6.png)

### 12. step6の1のCloud9ターミナルに戻り、以下のコマンドを実行してsrcディレクトリに移動

```ruby:コマンド
cd /home/ec2-user/environment/VodAws/src/
```

![snip_20200623123125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/9bc12861-6270-eab0-3ad7-2e963fc61210.png)

### 13. step6の1のCloud9ターミナルに戻り、以下のコマンドを実行してsrcディレクトリに移動

```ruby:コマンド
cat << EOF > aws-video-exports.js
const awsvideoconfig = {
		"awsInputVideo": "Step8の11のoVODInputS3の値",
		"awsOutputVideo": "Step8の11のoVODOutputUrlの値"
	};

export default awsvideoconfig;
EOF
```

![snip_20200623123611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/795d5418-0a2e-ae2c-1cc8-429c8367b5fa.png)

### 13. 以下のコマンドを実行してVodAwsディレクトリに移動

```ruby:コマンド
cd /home/ec2-user/environment/VodAws/
```

![snip_20200623123820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e403e37b-408b-2d47-8231-94cc8cf95c53.png)

## ■Step9: Hosting our app on Amplify

### 1. 以下のコマンドを実行してプロジェクトに静的ホスティングを追加

```ruby:コマンド
amplify hosting add
```

![snip_20200623131022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/93d309b0-a3ee-321a-e4ee-ccc0b823752a.png)


プロンプトの選択については下記のとおり。

実行するプラグインモジュールを選択

![snip_20200623131154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/65768541-ac7c-9527-e679-7ba3922bdc6b.png)

環境の選択

![snip_20200623131332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/85e5c2cf-44f3-0f06-9e26-d64b3612532a.png)

ホスティングするバケット名の確認（デフォルト）

![snip_20200623131441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/8f483254-756f-2cbd-ebf9-6205c17b3109.png)

設定確認

![snip_20200623131533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/728c4974-c7e8-8799-f2a4-ddd454283944.png)

### 1. 以下のコマンドを実行して静的リソースをAmazon S3およびAmazon CloudFrontに公開

```ruby:コマンド
amplify publish
※continue?についてはYを選択
```

![snip_20200623132037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e3daaac6-d4ba-f6c8-72a0-6ad3b443a7ad.png)

### 2. 公開が完了するとcloudFrontのURLが表示

![snip_20200623132218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/1f6153fa-d38a-f8e7-209f-c92a16e36f50.png)


### 3. 以下のコマンドを実行してnpm serverを起動

```ruby:コマンド
nmp start
```

![snip_20200623132707.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e3139265-2fe4-c19f-03b8-f3aedff55de5.png)

起動確認ができたらContrl+Cで停止(今回はlocalhostの閲覧確認を行わない）

![snip_20200623133012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e2276b63-62b3-7a8c-0427-1f87ce030382.png)


### 4. ブラウザよりcloudFrontのURLの閲覧

![snip_20200623132804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/70489761-b681-f8bb-5bfd-de242db7d333.png)


## ■Step 10: Create Users in Cognito User Pool

### 1. 別タブにてCognitoダッシュボードに移動

![snip_20200623133258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/ce3fa3fc-e2af-3419-585c-3c0571d11548.png)

### 2. 【 ユーザープールの管理 】を選択

![snip_20200623133349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/010c1c81-c502-097c-70f4-182442f2603f.png)

### 3. vodawsse*****_userpool_*** を選択

![snip_20200623133604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/f7b2af3a-900a-0715-7d02-f0c61cd5e706.png)

### 4. 【 ユーザーの作成 】を選択

![snip_20200623133756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/36e38356-971f-82b5-140c-3d37a9b01734.png)

### 5. 動画公開可能のユーザ作成

今回は【Vodaws 】というユーザー名で作成
電話番号は国番号から入力 例）日本の場合(81)

![snip_20200623134327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/7f526ad4-21c9-49b9-04f8-dc035fb0ae9d.png)

### 6. 【 グループに追加 】を選択

![snip_20200623134503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/fd8304c0-9afd-c677-cf45-87ce61c96dc9.png)

### 7. Admin を入力後、【グループに追加】を選択

 ![snip_20200623134921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/ee3d34a6-e9f4-f5d3-74c2-904b30631a7a.png)

### 8. ブラウザより https:// cloudFrontのURL /Admin へアクセス後、ユーザー名(Vodaws)および仮パスワードを入力の上、パスワード変更を実施

![snip_20200623135118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/40ba1394-61c8-5e92-94af-151197fa3eab.png)

![snip_20200623144311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/03e49c4c-7125-2276-ebed-99e8697ae6c3.png)

### 9. ログイン後、画像アップロード確認(mp4)

![snip_20200623135429.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/fbe75c32-714b-337c-4ef7-56e57cc8fd57.png)

![snip_20200623135617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/4fa5eb44-bd4c-cd03-870f-7436b311f59b.png)

画像アップロード確認後、ログアウト

### 10. Step10の4の画面に戻り、動画閲覧専用のユーザ作成

今回は【guest】というユーザー名で作成
電話番号は国番号から入力 例）日本の場合(81)

![snip_20200623140049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/a7faa262-e4c0-0e42-f41e-aa470eccb7d3.png)

### 11. ブラウザより https:// cloudFrontのURL / へアクセス後、ユーザー名(guest)および仮パスワードを入力の上、パスワード変更を実施

![snip_20200623140131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/eaaeac93-baf5-5b23-0156-282774e873bb.png)

![snip_20200623144131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/19017fec-e9ed-4b5f-ffcd-534c877a71fb.png)


### 12. ログイン後、Vodawsユーザーがアップロードしたsampleが表示されていることを確認

![snip_20200623140253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/eb788a29-f41a-b155-e51a-eb82b600a20b.png)

![snip_20200623140447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/2ce9c8f1-7647-c432-2290-2dc5aa61b229.png)

### 13. sampleを選択して動画が閲覧できることを確認

![snip_20200623140920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/5bcc5d5a-c65c-f53f-c0de-685e1969f9fd.png)