はじめての Amplify デプロイまで

# 概要
Amplify を使って react アプリケーションをデプロイするところまで

# 環境
Docker で作成します。

```yml:docker-compose.yml
version: '3'

services:
    amplify:
        build: ./
        ports:
            - "3000:3000"
            - "20002:20002"
        volumes:
            - ~/dev/AmplifyDemo:/var/www/AmplifyDemo
            # :より左は自分の環境に合わせる（credential, config をこのあとの作業で入れるor入る）
            - ~/dev/AmplifyDemo/aws/:/root/.aws/
        tty: true
```

のちのち Amplify Mock を利用したいので java を入れておきます。
不要ならなくても問題ないです。

```dockerfile:Dockerfile
FROM node:12.4

# amplify CLI
RUN npm install -g @aws-amplify/cli

# java for Amplify Mock
RUN apt update; apt install -y wget software-properties-common apt-transport-https
RUN wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
RUN add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
RUN apt update; apt install -y adoptopenjdk-11-openj9

WORKDIR /var/www/AmplifyDemo
```

起動
コンテナ名は自分の環境に置き換えて

```
$ docker-compose up -d
$ docker exec -it amplifydemo_amplify_1 bash
```

# Amplify が利用する IAM ユーザーを作成
```
$ amplify configure
Scanning for plugins...
Plugin scan successful
Follow these steps to set up access to your AWS account:

Sign in to your AWS administrator account:
https://console.aws.amazon.com/
Press Enter to continue

Specify the AWS Region
? region:  ap-northeast-1
Specify the username of the new IAM user:
? user name:  amplify-dev
Complete the user creation using the AWS console
https://console.aws.amazon.com/iam/home?region=undefined#/users$new?step=final&accessKey&userNames=amplify-dev&permissionType=policies&policies=arn:aws:iam::aws:policy%2FAdministratorAccess
Press Enter to continue

Enter the access key of the newly created user:
? accessKeyId:  ********************
? secretAccessKey:  ****************************************
This would update/create the AWS Profile in your local machine
? Profile Name:  default

Successfully set up the new user.
```

これで ~/.aws 配下に上記作成の IAM ユーザーのキーが書かれた credentials と config が生成される。

# React プロジェクト作成
※ すでにプロジェクトが存在している場合は 適宜 git clone など。

```
$ npx create-react-app demo --typescript
```

起動確認

```
$ cd demo
$ yarn start
```

http://localhost:3000 にアクセス
<img width="572" alt="スクリーンショット 2020-07-04 7.48.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/0a97ef49-a656-7b33-02ae-bdd7e68151e2.png">

# Amplify プロジェクト作成
```
amplify init
Note: It is recommended to run this command from the root of your app directory
? Enter a name for the project demo
? Enter a name for the environment dev
? Choose your default editor: IntelliJ IDEA
? Choose the type of app that you're building javascript
Please tell us about your project
? What javascript framework are you using react
? Source Directory Path:  src
? Distribution Directory Path: build
? Build Command:  npm run-script build
? Start Command: npm run-script start
```

これで AWS Amplify コンソールに demo アプリが作成されていることが確認できる。
<img width="458" alt="スクリーンショット 2020-07-04 7.57.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/8d396ca4-beac-dca2-7885-9a60ed525646.png">

# api 追加
```
$ amplify add api
? Please select from one of the below mentioned services: GraphQL
? Provide API name: demo
? Choose the default authorization type for the API Amazon Cognito User Pool
Using service: Cognito, provided by: awscloudformation

 The current configured provider is Amazon Cognito.

 Do you want to use the default authentication and security configuration? Default configuration
 Warning: you will not be able to edit these selections.
 How do you want users to be able to sign in? Email
 Do you want to configure advanced settings? No, I am done.
Successfully added auth resource
? Do you want to configure advanced settings for the GraphQL API No, I am done.
? Do you have an annotated GraphQL schema? No
? Do you want a guided schema creation? Yes
? What best describes your project: Single object with fields (e.g., “Todo” with ID, name, description)
? Do you want to edit the schema now? Yes
Please edit the file in your editor: /var/www/AmplifyDemo/demo/amplify/backend/api/demo/schema.graphql
? Press enter to continue Selected  editor intellij was not found in your machine. Please manually edit the file created at /var/www/AmplifyDemo/demo/amplify/backend/api/demo/schema.graphql
? Press enter to continue

The following types do not have '@auth' enabled. Consider using @auth with @model
	 - Todo
Learn more about @auth here: https://docs.amplify.aws/cli/graphql-transformer/directives#auth


GraphQL schema compiled successfully.

Edit your schema at /var/www/AmplifyDemo/demo/amplify/backend/api/demo/schema.graphql or place .graphql files in a directory at /var/www/AmplifyDemo/demo/amplify/backend/api/demo/schema
Successfully added resource demo locally

Some next steps:
"amplify push" will build all your local backend resources and provision it in the cloud
"amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud
```

api 追加したら push する

```
$ amplify push
```

ここで現状までの状態を git にあげておく
今回の例で言うと demo 配下のもの。

# デプロイ
主に[公式の手順](https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/getting-started.html)をなぞっただけ。
Amplify コンソールでリポジトリの接続から Git 連携しておく
さきほどあげた git リポジトリの master を選択。
保存してデプロイ。

問題なくデプロイできていると以下のような感じ
<img width="750" alt="スクリーンショット 2020-07-04 9.22.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/cde98814-e984-1b7b-2c1e-8b30fe916c21.png">

<img width="1671" alt="スクリーンショット 2020-07-04 9.22.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/229eba2f-df0d-2f85-7029-e5f324f9d311.png">

これで master に push するたびに、デプロイが走る。


[公式](https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/multi-environments.html)を参考に

以下のようにしてバックエンドの環境を増やして、本番用/ステージング用などと分けます。

```
amplify env add
```

作ったバックエンドの環境と git 連携してあるフロントエンドとの関係を定義します。
本番環境: frontned（git の master）、backend（amplify env の prod）
ステージング環境: frontend（git の develop）、backend（amplify env の dev）
のように。
<img width="601" alt="スクリーンショット 2020-07-04 11.40.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/b3018b67-3de7-50b2-7015-4e8094e1f307.png">



# おまけ
もし、すでにもろもろプロジェクトが作成されていて、自分が開発に途中から参画するときにする作業

1. プロジェクトの git clone
1. Amplify の IAM ユーザーの認証情報をもらう（例えばインフラ担当者から）  
もらった認証情報から ~/dev/AmplifyDemo/aws/（自分の環境に合わせてください） に credentials と config ファイルを作成
1. docker の起動までは変わらず手順通りやる（clone してきたパスなど適宜環境に合わせて docker-compose.yml を変更）
1. docker コンテナ内に入って、プロジェクトのディレクトリに移動する
1. amplify init  
ポイントは最初に既存の環境があるか聞かれるので Yes, 次にその環境を選択すること。

```
$ amplify init
Note: It is recommended to run this command from the root of your app directory
? Do you want to use an existing environment? Yes
? Choose the environment you would like to use: dev
```

react 画面の確認
clone してきたばかりであれば、初回は yarn install 必要

```
$ yarn install
```

```
$ yarn start
```

起動確認 http://localhost:3000

# 続き
[Amplify で GraphQL と Cognito 認証](https://qiita.com/Tomoyuki_Mikami/items/029ebe455cdeba7881a7)