AWS Amplifyを試してみる

せっかくのGWなので、後輩からもらったお題を勉強というかハンズオンしてみようと思う。
ただ今回は得意分野じゃないので、かなり適当。たぶん嘘ついたり的外れなことを言っていると思う。
おせっかいを焼いてくれる人がいたら、ぜひ今度詳しく教えて欲しい。

# AWS Amplifyとは

ここが公式ページ。
https://aws.amazon.com/jp/amplify/

ふわっとした説明なので何をしてくれるかよく分からない…。
実際触ってみた感じ、

* AWSの他サービスと簡易に連携できるNode.jsのフレームワークとamplify CLI
* CodeCommitなどのリポジトリからワンストップにリリースするパイプライン

を提供してくれるっぽい。
ただし、SaaSではなく、EC2相当のサーバ部分は自分で調達する必要がある模様。
（roleは使っていないので、たぶんEC2じゃなくても動く。）

# 環境

|項目|設定|
|:--|:--|
|OS|AmazonLinux2|
|Kernel|4.9.76-38.79.amzn2.x86_64|
|npm|6.9.0|
|Node.js|v12.1.0|

# やったこと

AmplifyのGetting Startedに従ってコマンドをペチペチしただけ。

自分の理解できた範囲で振り返ってみる。

## Node.jsのインストール
初めてやった。
Node.jsにもパッケージ管理の概念があり、Node Package Managmentを使う。

```:BASH
[root@ip-172-30-0-174 myapp]# npm ls
myapp@0.1.0 /data/amplify/myapp
├─┬ aws-amplify@1.1.26
│ ├─┬ @aws-amplify/analytics@1.2.14
│ │ ├── @aws-amplify/cache@1.0.25 deduped
│ │ ├── @aws-amplify/core@1.0.25 deduped
│ │ └── uuid@3.3.2
│ ├─┬ @aws-amplify/api@1.0.33
│ │ ├── @aws-amplify/auth@1.2.22 deduped
│ │ ├── @aws-amplify/cache@1.0.25 deduped
│ │ ├── @aws-amplify/core@1.0.25 deduped
│ │ ├── @types/zen-observable@0.5.4
│ │ ├─┬ axios@0.17.1
│ │ │ ├─┬ follow-redirects@1.7.0
│ │ │ │ └─┬ debug@3.2.6
│ │ │ │   └── ms@2.1.1
│ │ │ └── is-buffer@1.1.6
│ │ ├─┬ graphql@0.13.0
│ │ │ └── iterall@1.1.4
│ │ ├── uuid@3.3.2 deduped
│ │ └── zen-observable@0.8.14
│ ├─┬ @aws-amplify/auth@1.2.22
           :
（めちゃくちゃでてくるので、以下割愛。）
```

## Amplify configure
対話形式で設定をする。
インストール中、IAMのページへのリンクがでてくるんだけど、それを踏ませてManagement ConsoleでIAMユーザを作らせる、という仕組み。
AdministratorAccessのユーザを作らされたので、結構雑だな、と思った。
consoleでIAMユーザを作成後、terminalでアクセスキーとシークレットアクセスキーを入力し、設定完了。
amplify cliは内部的にaws cliを呼んでいるようで、ホームディレクトリ配下の.awsに専用のprofileができていた。[^1]

## Amplify init
叩くとCloudFormationでAWSリソースの作成が走る。
これまたCloudFormationにはあまり詳しくないのだが、Stackをネストさせてリソースを管理している。
init以外のタイミングでも、例えば「S3のWeb hostingを利用する」とamplifyの設定を変更してpublishすると、amplify cliが親stack（って言っていいのかな）をupdateしてS3を作成するための子Stackを追加する。
この記事を書いている最後には、親stackはこうなった。

<details><summary>describe-stacksの結果</summary><div>

```json
{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:896403600077:stack/myapp-dev-20190501101729/e3a00f30-6bae-11e9-a9bf-0a56b21e2412",
            "Description": "Root stack for the Amplify AWS CloudFormation provider",
            "Parameters": [
                {
                    "ParameterValue": "myapp-dev-20190501101729-authRole",
                    "ParameterKey": "AuthRoleName"
                },
                {
                    "ParameterValue": "myapp-dev-20190501101729-deployment",
                    "ParameterKey": "DeploymentBucketName"
                },
                {
                    "ParameterValue": "myapp-dev-20190501101729-unauthRole",
                    "ParameterKey": "UnauthRoleName"
                }
            ],
            "Tags": [],
            "Outputs": [
                {
                    "OutputKey": "AuthRoleName",
                    "OutputValue": "myapp-dev-20190501101729-authRole"
                },
                {
                    "OutputKey": "UnauthRoleArn",
                    "OutputValue": "arn:aws:iam::896403600077:role/myapp-dev-20190501101729-unauthRole"
                },
                {
                    "OutputKey": "AuthRoleArn",
                    "OutputValue": "arn:aws:iam::896403600077:role/myapp-dev-20190501101729-authRole"
                },
                {
                    "Description": "CloudFormation provider root stack Region",
                    "ExportName": "myapp-dev-20190501101729-Region",
                    "OutputKey": "Region",
                    "OutputValue": "ap-northeast-1"
                },
                {
                    "Description": "CloudFormation provider root stack deployment bucket name",
                    "ExportName": "myapp-dev-20190501101729-DeploymentBucketName",
                    "OutputKey": "DeploymentBucketName",
                    "OutputValue": "myapp-dev-20190501101729-deployment"
                },
                {
                    "OutputKey": "UnauthRoleName",
                    "OutputValue": "myapp-dev-20190501101729-unauthRole"
                },
                {
                    "Description": "CloudFormation provider root stack ID",
                    "ExportName": "myapp-dev-20190501101729-StackName",
                    "OutputKey": "StackName",
                    "OutputValue": "myapp-dev-20190501101729"
                },
                {
                    "Description": "CloudFormation provider root stack name",
                    "ExportName": "myapp-dev-20190501101729-StackId",
                    "OutputKey": "StackId",
                    "OutputValue": "arn:aws:cloudformation:ap-northeast-1:896403600077:stack/myapp-dev-20190501101729/e3a00f30-6bae-11e9-a9bf-0a56b21e2412"
                }
            ],
            "EnableTerminationProtection": false,
            "CreationTime": "2019-05-01T01:17:29.965Z",
            "Capabilities": [
                "CAPABILITY_NAMED_IAM"
            ],
            "StackName": "myapp-dev-20190501101729",
            "NotificationARNs": [],
            "StackStatus": "UPDATE_COMPLETE",
            "DisableRollback": false,
            "RollbackConfiguration": {},
            "LastUpdatedTime": "2019-05-01T02:11:23.166Z"
        }
    ]
}
```
</div></details>

## プロセスの起動
amplify init叩く前から起動させていた気がするけど、npmコマンドでプロセスを起動。
apacheみたいなwebサーバ無しでサービス開始できるのは楽ちんだけど、とりあえずサービス提供だけ、感がすごい。
ただ、短時間でwebサービスの環境が整うのは確か。裏側では必要なAWSリソース作り終わっているし。

EIP宛にアクセスすると、こんな感じ。[^2]

![スクリーンショット 2019-05-01 12.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179633/f7457cfa-c6d9-6f75-016f-904a0b019ab3.png)

## その他いろいろ
このサンプルアプリが何しているのかはまじでよくわからん。
裏でlambdaが動いて何かをカウントアップしているみたいだけど、CloudWatch Logsにはlambdaのログが1アクセス分しかない。
amplifyのanalyticsオプションで作成されたoregonのPinpointに1件アクセス記録はあるけど、何回ボタン押しても変化無し。
ユニークユーザ数のカウントになっているのかなと思ったけど、ブラウザ変えてもスマホから繋いでも変わらない…。

勝手に作成されたLambdaFunctionのソース見ればわかるんだろうけどこのへんでやる気が無くなってきた。
そもそもクライアントサイドも対象のはずだが、そっちは全然見てないｗ

最初から気になっていたけど、結局EC2は自分たちで用意しないといけないので、deployやリリースのこと考えなければならず、スモールスタート的にちょっと動かす人用のサービスなのかな。
Elastic Beans Talkと似ている気がするけど、amplifyはモバイルターゲット&他AWSサービスとの統合が透過的っていうところが違うんでしょうかね。
Web Hostingを使いたい、だけでS3のこと知らなくても自動でホスティング環境が作られるし。

メモだけ貼っとこ。
![IMG_4006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179633/2b28b116-ad1c-a76c-3438-f94e93f6d5a8.jpeg)

amplifyを通じて、どっちかというとpinpointのほうに興味が湧いてきたので、こっちはこっちでちょっと見てみたい。
モバイル向けサービスを作る時にはセットで用意しておくと嬉しいことがありそうな気がする。

というところで、今日はおしまい。[^3]


[^1]: profile名の指定無しでdefaultにすることも可能。
[^2]: EC2殺したからもう見られないです。
[^3]: CloudFormationって、stack削除したらきれいに全部消してくれるんじゃなかったっけ…。後片付けのためにStack削除したけど、バケットとか消えてなくて削除がめんどくさかった。ていうかpinpointのprojectってどうやって削除するの…ｗ