AWS Amplify CLI をチュートリアルで試してみた

Guten Tag! また半袖が着れる季節になってきました、ベルリンから伊藤です!3週間前 ビキニ→先週 コート→今 半袖(※あくまで一例です)とベルリンの季節の移り変わりが不思議です。

さて、AWS Amplify というサービスの理解のために、Getting Started のチュートリアルに従って以前試してみた内容を公開します。

AWS Amplify とは、Webサイト/Webアプリのデプロイ・ホスティングが簡単に行える、昨年の re:Invent でリリースされたサービスです。東京リージョンでコンソールが使用できるようになったのも、今年4月のこと。 Dev.IO でも Amplify の記事 が続々と出てきています。

では早速行ってみましょう。

前準備

Amplify CLI のインストールと設定を行います。

下記のバージョンで確認しています。まだの場合は Node.jsnpm のインストールが必要です。

$ node -v
v10.16.0
$ npm -v
6.9.0

$ sudo npm install -g @aws-amplify/cli を実行して、Amplify CLI をインストールします。

次に $ amplify configure を実行して Amplify CLI 設定を行います。実行するとブラウザが開いてログインが求められます。

詳細な流れはこちらのサイトで丁寧に紹介されていますが、Amplify が実行されるリージョン、IAM ユーザ、CLI プロファイルなどを定義します。下記のようにインタラクティブに値を入力していきます。(例はリージョン以外デフォルト)

これで amplify コマンドが使用できるようになります。

1. 新しいアプリの作成

下記それぞれ実行し、amplify-js-app ディレクトリを作成、空のファイルを用意します。

$ mkdir -p amplify-js-app/src && cd amplify-js-app
$ touch package.json index.html webpack.config.js src/app.js

こんな感じで出来上がりますね。

$ tree
.
|-- index.html
|-- package.json
|-- src
|   `-- app.js
`-- webpack.config.js

1 directory, 4 files

作成して空の package.json に下記の通り書き込みます。

{
  "name": "amplify-js-app",
  "version": "1.0.0",
  "description": "Amplify JavaScript Example",
  "dependencies": {},
  "devDependencies": {
    "webpack": "^4.17.1",
    "webpack-cli": "^3.1.0",
    "copy-webpack-plugin": "^4.5.2",
    "webpack-dev-server": "^3.1.5"
  },
  "scripts": {
    "start": "webpack && webpack-dev-server --mode development",
    "build": "webpack"
  }
}

上で定義した内容に沿って、npm install で関連パッケージをインストールします。

$ npm install

> fsevents@1.2.9 install /Users/mai/Downloads/amplify-js-app/node_modules/fsevents
> node install

node-pre-gyp WARN Using needle for node-pre-gyp https download 
[fsevents] Success: "/Users/mai/Downloads/amplify-js-app/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64/fse.node" is installed via remote
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN amplify-js-app@1.0.0 No repository field.
npm WARN amplify-js-app@1.0.0 No license field.

added 653 packages from 370 contributors and audited 9071 packages in 13.305s
found 0 vulnerabilities

各ファイルに下記の通り入力します。今回の検証に使用するウェブアプリのページです。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Amplify Framework</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <style>
            html, body { font-family: "Amazon Ember", "Helvetica", "sans-serif"; margin: 0; }
            a { color: #FF9900; }
            h1 { font-weight: 300; }
            .app { width: 100%; }
            .app-header { color: white; text-align: center; background: linear-gradient(30deg, #f90 55%, #FFC300); width: 100%; margin: 0 0 1em 0; padding: 3em 0 3em 0; box-shadow: 1px 2px 4px rgba(0, 0, 0, .3); }
            .app-logo { width: 126px; margin: 0 auto; }
            .app-body { width: 400px; margin: 0 auto; text-align: center; }
            .app-body button { background-color: #FF9900; font-size: 14px; color: white; text-transform: uppercase; padding: 1em; border: none; }
            .app-body button:hover { opacity: 0.8; }
        </style>
    </head>
    <body>
        <div class="app">
            <div class="app-header">
                <div class="app-logo">
                    <img src="https://aws-amplify.github.io/images/Logos/Amplify-Logo-White.svg" alt="AWS Amplify" />
                </div>
                <h1>Welcome to the Amplify Framework</h1>
            </div>
            <div class="app-body">
                <button id="AnalyticsEventButton">Generate Analytics Event</button>
                <div id="AnalyticsResult"></div>
            </div>
        </div>
        <script src="main.bundle.js"></script>
    </body>
</html>
const CopyWebpackPlugin = require('copy-webpack-plugin');
const webpack = require('webpack');
const path = require('path');

module.exports = {
    mode: 'development',
    entry: './src/app.js',
    output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/
            }
        ]
    },
    devServer: {
        contentBase: './dist',
        overlay: true,
        hot: true
    },
    plugins: [
        new CopyWebpackPlugin(['index.html']),
        new webpack.HotModuleReplacementPlugin()
    ]
};

早速、 $ npm start を実行してみましょう。"Compiled successfully." が表示されたら、ブラウザで http://localhost:8080 にアクセスしてみます。次のようにページが表示されました!しかし、ボタンを押してみてもまだ何も起きません。

次に進むので実行中の $ npm start は一度キャンセルしてOKです。

2. Amplify のインストール

続けて amplify-js-app ディレクトリ直下で、$ npm install --save aws-amplify を実行してアプリに Amplify をインストールします。

3. AWS バックエンドの設定

同じ場所で、 $ amplify init を実行します。ここでは新しい AWS 側のバックエンドリソースを作成し、アプリ用に設定していきます。

こちらも詳細な流れは先ほどのサイトで丁寧に紹介されていますが、今回はすべてデフォルト値で、environment の名前は dev で進めます。

環境が無事に初期設定されたら、下記のように表示されます。試しに amplify statusamplify を実行してみると、このように現在の状況と、利用可能なサービスカテゴリ一覧が表示されます。

必要なバックエンドリソースの作成

$ amplify add <category-name> とコマンドを実行することで上のサービスカテゴリを追加できます。今回は、まず $ amplify add analytics を実行して分析カテゴリを追加しましょう。CloudFormation による Pinopoint 作成をローカルで定義しますが、値はまたデフォルトで進めます。次に、$ amplify push を実行してAWS 上で CloudFormation による作成を進めます。

上で出てくる Auth リソースは、Analytics の依存関係とのことで、自動的に一緒に作成されています。

Analytics が無事に作成されると、Amplify 設定ファイル(aws-exports.js)がソースディレクトリに追加されていました。

$ cat src/aws-exports.js 
// WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.

const awsmobile = {
    "aws_project_region": "eu-central-1",
    "aws_cognito_identity_pool_id": "eu-central-1:08f60bdd-7e97-41e1-9715-44b9abde140c",
    "aws_cognito_region": "eu-central-1",
    "oauth": {},
    "aws_mobile_analytics_app_id": "8baa8da65bc743208588aef11689087a",
    "aws_mobile_analytics_app_region": "eu-central-1"
};

[参考] サービス更新や削除には

  • サービスの更新: amplify update <category-name>
  • サービスの削除: amplify remove <category-name>
  • プロジェクトの削除: amplify delete (※ローカル・クラウドともすべて削除)

4. AWS リソースの統合

続いて、空の src/app.js ファイルに下記の通り書き込みます。

import Auth from '@aws-amplify/auth';
import Analytics from '@aws-amplify/analytics';

import awsconfig from './aws-exports';

// retrieve temporary AWS credentials and sign requests
Auth.configure(awsconfig);
// send analytics events to Amazon Pinpoint
Analytics.configure(awsconfig);

const AnalyticsResult = document.getElementById('AnalyticsResult');
const AnalyticsEventButton = document.getElementById('AnalyticsEventButton');
let EventsSent = 0;

AnalyticsEventButton.addEventListener('click', (event) => {
  const { aws_mobile_analytics_app_region, aws_mobile_analytics_app_id } = awsconfig;

  Analytics.record('Amplify Tutorial Event')
    .then((event) => {
      const url = `https://${aws_mobile_analytics_app_region}.console.aws.amazon.com/pinpoint/home/?region=${aws_mobile_analytics_app_region}#/apps/${aws_mobile_analytics_app_id}/analytics/events`;
      AnalyticsResult.innerHTML = '<p>Event Submitted. </p>';
      AnalyticsResult.innerHTML += '<p>Events sent: '+(++EventsSent)+'</p>';
      AnalyticsResult.innerHTML += '<a href="'+url+'" target="_blank">View Events on the Amazon Pinpoint Console</a>';
    });
});

ここでは前段で追加した Auth と Analytics のみインポートしています。

(代わりに import Amplify from 'aws-amplify' と書くことですべての Amplify ライブラリがインポートできるようですが、必要な分だけインポートした方が良いです)

さあ!改めまして、 $ npm start を実行して、ブラウザで http://localhost:8080 にアクセスします。

今度は、クリックするとこのようにイベントが送信されました!(私の環境では少し時間がかかり、クリックしてから1分ほどしてようやく submitted のメッセージが表示されました。)

Pinpoint のページに飛んでみると、クリックした数だけイベントが記録されていることが分かります。

5. Web サイトホスティングとしてアプリを起動

最後に、開発環境としてアプリで S3 の Web サイトホスティングを有効にします。 $ amplify add hosting を実行して、下記のように index ページやエラーページを指定して進めます。

終わったら、言われるがままに $ amplify publish でアプリをパブリッシュします。CloudFormation の更新と作成が行われ、完了したらウェブサイトホスティングのエンドポイントが表示されます。

✔ Uploaded files successfully.
Your app is published successfully.
http://<バケット名>.s3-website.eu-central-1.amazonaws.com

晴れて、ここまで構築したアプリがS3にデプロイされ、この URL から先ほどと同様にアプリのウェブページを実行できるようになりました!

ちなみに、このエンドポイントURLや先ほどのPinpoint URLを含め、アプリで使用されているカテゴリーの詳細は $ amplify status を実行していつでも確認することができます。

以上、Amplify のチュートリアルをご紹介しました!

おしまい

お掃除

下記、今回作成されたリソースを確認してそれぞれコンソールから削除しました。

  • Cognito ID プール
  • S3 バケット:
    • amplify-js-app-20190625170810-hostingbucket-dev
    • amplify-js-app-dev-20190625164628-deployment
  • Lambda 関数: amplify-js-app-dev-20190625164628-PinpointFunction-IW2AS2PF4LRD
  • AWS ロール:
    • arn:aws:iam::(Account ID):role/pinpointLambdaRolefffe5bd2-dev
    • arn:aws:iam::(Account ID):role/amplify-js-app-dev-20190625164628-authRole
    • arn:aws:iam::(Account ID):role/amplify-js-app-dev-20190625164628-unauthRole

豆知識

他にも Amplify CLI では様々なコマンドがありますのでご確認くださいませ。

なお、現時点の Amplify CLI (v1.7.6) では開発(S3ホスティング)・本番(CloudFront)へパブリッシュする際にパブリックへの読み取りを付与する仕様のようです。ただし、Amplify Console を使用してデプロイし、アクセス制限をかけることができるそうです。

取り急ぎ、とっても簡単な Amplify、試してみてはいかがでしょうか?