【参考まとめ】AWS Amplify ✕ Nuxt.js ✕ stripeでのサイト制作のための記事一覧

# はじめに
Nuxt.js✕Amplifyの組み合わせでの開発にあたって、全体的に参考になった記事をまとめました。
Nuxtってなに？AWSってどうやって始めるの？決済処理どうしよう、、、の状態から参考にしている記事になるため、基礎的なことから込み入った記事まで幅広くまとまっています。

今でも何度も読み直す記事や重要な記事には「★」マークを付けてますので、ご参考までに。

# AWS共通
AWSサービスを利用するにあたっての基礎記事です。

## ★★AWSアカウントの初期設定
AWSアカウントを作成したら、まずはこれやる。

[AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888)

## AWSリソースグループ(AWSリソース管理)
テスト環境や本番環境が同一アカウントでの作業になる場合は、やりたいけどまだできていない。

[[AWS]リソースグループを使って、テスト・ステージング・本番環境ごとにAWSリソースを管理する](https://dev.classmethod.jp/cloud/aws/resurce-group/)

## AWSのざっくり見積もり
下記サイトで主要サービスのメインとなる料金についてざっくり見積もりが可能です。

[AWS料金のざっくり計算](https://aws.noplan.cc/)
# AWS Amplify
今回の主役であるAmplifyについて重要な記事をまとめています。

## ★★Amplify CLIの初期設定と解説
AWS Amplify CLIの使い方からインストールから初期セットアップまではこの記事を見ながらやるのが早いです。

[AWS Amplify CLIの使い方〜インストールから初期セットアップまで〜](https://qiita.com/Junpei_Takagi/items/f2bc567761880471fd54)

## ★★Amplify API(Appsync)の公式ドキュメント
Amplifyでのサイト制作において一番読むと言っても過言ではないドキュメント。

[Amplify API 公式ドキュメント](https://aws-amplify.github.io/docs/js/api)

## ★★Amplify Auth(Cognito)の公式ドキュメント
ログインページを自作するにあたっては読み込み必須です。ソーシャルログインの方法やワンタイムパスワードの設定など、サイト制作に必須な項目が色々載っています。

[Amplify Auth 公式ドキュメント](https://aws-amplify.github.io/docs/js/authentication)

## ★★★Amplify GraphQL Transform 公式ドキュメント
スキーマ設計をおこなうためには、理解が必須です。

[Amplify GraphQL Transform 公式ドキュメント](https://aws-amplify.github.io/docs/cli-toolchain/graphql?sdk=js)

## Amplify Storage(S3)の公式ドキュメント
amplifyを使って気軽にS3でファイル管理ができます。

[Amplify Storage 公式ドキュメント](https://aws-amplify.github.io/docs/js/storage)

## Amplify Storage(S3)の実際の使い方
Reactで作業している記事ですが、Vueでも十分置き換えて理解ができるので、Storageを使うときは一度目を通したほうがいいです。

[AWS Amplify入門① / Storageについての解説](https://omuriceman.hatenablog.com/entry/amplify1)

## Amplifyを使った初めての学習用記事一覧 
AmplifyとNuxt.jsを始めるにあたって、学習を兼ねて作成した記事たちです。お世話になりました。

[Vue.js×GraphQL(AppSync)×AmplifyでTODOリストを作る](https://qiita.com/is_ryo/items/b9feeb017366b0cee544) 
[AWS AmplifyでサーバレスWebアプリの構築(Cognito + API Gateway + IAM認証)](https://qiita.com/nakayama_cw/items/c4aae9ddb19c087e18cb) 
[AWS Amplify + Vue.js + AppSync + Cognito +その他諸々でリアルタイム更新なサーバレスWebアプリをデプロイ](https://qiita.com/nakayama_cw/items/6d3514b51c5fbf9ba450)


## aws-amplify-vueの公式ドキュメント
amplifyさんが用意してくれている、Vue.jsのコンポーネントや便利なパッケージ。細かい融通は利かない分、細かいデザインにこだわらない業務での使用であれば、時間短縮できるので実装の価値はあると思います。

[公式ドキュメント](https://aws-amplify.github.io/docs/js/vue)

## Amplify UIのコンポーネントのカスタマイズ方法(上書き)
色々と議論されているようですが、vueやreactで用意されたコンポーネントの上書きは大変そうです。

[RFC: Amplify UI Component Library Refactor #3279](https://github.com/aws-amplify/amplify-js/issues/3279)

# AWS各種サービス
Amplifyを利用するためには、そのベースとなる各種サービスの基礎知識も必要になります。その基礎知識を学ぶのに参考になった記事を紹介します。

## AWS AppSync 特徴解説
amplifyでAppSyncを使うにあたって、そもそもAppSyncって？を公式がわかりやすく説明してくれています。

[AWS AppSync の特徴(公式ドキュメント)](https://aws.amazon.com/jp/appsync/product-details/)

## AppSyncのデータの型
Amplifyでスキーマを作成する時に、どんな型が利用できるのか確認したくなったときはこちらを参考ください。

[AWS AppSync でのスカラー型(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/scalars.html)

## DynamoDBベストプラクティス
DynamoDBの全体像を掴んだ上で、読むとより理解が深まる記事です。

[DynamoDB ベストプラクティス](https://qiita.com/inouet/items/bcf9467a65b27c362ecf)

## ★★DynamoDBキー・インデックスについて
AmplifyでAppSyncを使うには、ある程度DynamoDBさんとも友だちになる必要があります。この記事の内容が理解できると、スキーマ設計がしやすくなるので、DynamoDBについてこの記事だけでも
読んだほうがいいです。

[DynamoDBのキー・インデックスについてまとめてみた](https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd)

## DynamoDB グローバルインデックスを使用したクエリのパフォーマンス向上とコスト削減(公式)
グローバルインデックスについて公式が解説してくれています。仲を深めるためには、一読をおすすめします。

[DynamoDB グローバルセカンダリインデックスを使用してクエリのパフォーマンスを向上させ、コストを削減する方法(公式ブログ)](https://aws.amazon.com/jp/blogs/news/how-to-use-dynamodb-global-secondary-indexes-to-improve-query-performance-and-reduce-costs/)

## DynamoDBでのオートインクリメント/シーケンス
AmplifyでのAppSyncでは一意なIDを自動生成してくれますが、DynamoDB直書きの場合は、そんなことはしてくれません。いずれオートインクリメントの機能は追加されそうな気もしますが、現状は調べた限りこの記事通りにするのがベターかなと思っています。

[DynamoDB でシーケンスを管理する](https://dev.classmethod.jp/cloud/aws/dyanmodb-sequenses/)

## ★DynamoDBでの命名ルールおよびデータ型
各プライマリキー属性(パーティションキーとソートキー)は、文字列、数値、またはバイナリとして定義する必要あるという罠(boolできないので、boolでクエリ検索できない、、、が、filter検索はbool可)。これ地味にめちゃくちゃハマったので、必ず知っておいたほうがいい情報。

[命名ルールおよびデータ型(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html)

## ★DynamoDB✕Lambdaで書込を検知して関数を実行する方法(公式)
サイト設計を進めてくとどこかで必ず必要になってくる機能です。

[チュートリアル: DynamoDB テーブルの新しい項目の処理(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.Lambda.Tutorial.html)

## DynamoDBのアクセスコントロール(公式)
DynamoDB自体でもアクセス権限の設定をIAMポリシーを使って細かく設定できるようです。Amplifyを使わない権限設計を考える場合には必須の項目になります。

[詳細に設定されたアクセスコントロールのための IAM ポリシー条件の使用(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/specifying-conditions.html)

## ★★Cognito解説記事
まずこの記事を読んで、Cognitoのサービスに出てくる言葉をなんとなく把握すると他の記事が読みやすくなると思います。

[Cognitoの説明に使われている言葉を整理する](https://qiita.com/gki/items/f228e9b46fbb4a5d528c)

## ★Cognitoソーシャルログインの設定
下記の3つの記事を参考に、ソーシャルログインは実装できます。下記記事はAmplifyを使ってはいないので、色々と工夫されている部分がありますが、Amplifyを使えばそのあたりも簡単に実装できます。

[AWS CognitoにGoogleとYahooとLINEアカウントを連携させる](https://qiita.com/poruruba/items/189945dc64edfe1f2464)
[【AWS】CognitoでGoogleソーシャルログイン。Amplifyと連携してVue.jsアプリケーションに組み込む](https://qiita.com/chitamano/items/d28f205ece7cbe46c02a)
[AmazonCognitoでGoogle/Facebook認証してトークンを取得する](https://qiita.com/is_ryo/items/a437225115b27e05c8ee)

## ★Lambdaで DynamoDBStreamをトリガーとした関数の実行
DynamoDBへの書込を検知して、Lambdaを実行。サーバレスアーキテクチャを組み立てるにあたっては必須な知識ですが、とりあえず使う分にはそんなに難しくはないです。

[DynamoDB StreamをトリガーにしてLambdaを実行する](https://qiita.com/Fujimon_fn/items/1f18360ee9ebf6832617)

## LambdaでAppSyncを使用する
LambdaでAppSyncを使用する方法もあるようです。こちらは参考までに。

[AWS Lambda から AppSync の API を ぶん殴る](https://blog.r3it.com/aws-lambda-to-appsync-1aa0c2f1da04)

## ★Lambdaからusernameまたはemailを使ってCognitoから情報を取得する
Cognitoに登録してある情報をLambdaから取得したことはよくあるので、知っておいて損なし。

[Cognito User Poolsでユーザー名とEmailのどちらからでもユーザー情報を取得できるようにする](https://wp-kyoto.net/get-user-by-email-or-username-from-cognito-user-pools)
[Class: AWS.CognitoIdentityServiceProvider(公式ドキュメント)](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html)

## ★Lambdaから別関数のLambdaを呼び出す
関数をできる限り疎結合にスッキリ保つために、あえて共通関数を作成し、呼び出す。これがベストプラクティスかどうかはわかりませんが、メンテナンスはこの方法のほうが圧倒的にやりやすいです。記事に記載がありませんが、呼び出す側のLambda関数のロールにLambdaを呼び出せる権限をもたせる必要があります。

[LambdaからLambdaを呼び出す](https://qiita.com/spring_i/items/c4b605402360cdfd4c0e)
[[AWS]知っておいたほうがいいLambda関数の呼び出しタイプとリトライ方式まとめ](https://dev.classmethod.jp/cloud/aws/lambda-idempotency/)

## Lambdaのステージとエイリアスを使ったバージョン管理　
この記事のような形でバージョン管理を今後はしていきたいと思っています。

[[API Gateway + Lambda]ステージとエイリアスを使ってバージョン管理してみた](https://dev.classmethod.jp/cloud/aws/version-management-with-api-gateway-and-lambda/)

## ★SESの送信制限を解除する
SESの利用でまずはじめにやることはこちら。

[Amazon SESの送信制限を解除する（SandBoxの外へ移動する）](https://www.infoscoop.org/blogjp/2015/07/29/amazon-ses-release-limit/)

## ★★LambdaでのSESを使ったメール送信
問い合わせ機能の実装には必ず使うため、最低限の知識は必要になります。

[Lambda と Amazon SES を使用して E メールを送信するにはどうすればよいですか?(公式)](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-send-email-ses/)

## ★Lambda×SESでの文字化け対策
Lambdaを使って簡単な問い合わせの自動返信機能を作成するのに必須です。知ったら簡単ですが、これもたどり着くまでに地味に時間かかったんだよなぁ。

[LambdaでSESメール送信時に送信者名が文字化けする際の対策](http://arket789.hatenablog.com/entry/2017/09/23/205443)

## ★SESの詳細設定
SESを使うにあたって、細かい設定を行うことで、様々なことに対処できます。

[AWS SESをちゃんと使うためにやるべきこと](https://qiita.com/zaru/items/4be9b55ba807670cf224)

## CodeCommitの初期設定関連
AWSでゴリゴリやるからCodeCommit一択だろう、と思って始めましたが、Amplifyコンソールなんかは、別にgithubやBitbuketでも問題ないので、チケット管理とか考えたらBitbuketで良かったかなぁなんて思ったり思わなかったり。きっと今後、CodeCommitにしていたよかったと思える日がくるであろう。

[AWSのCodeCommit使い方。アクセスキー作るところからなど。](https://qiita.com/sachiko-kame/items/dff732276dffd22e7682)

## CodeCommitの ssh接続の設定
ssh接続設定のやり方を公式がわかりやすく説明してくれています。

[Linux, macOS, or Unix 上で AWS CodeCommit リポジトリに SSH 接続するために必要なセットアップ手順(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-unixes.html)

## CloudWatchEventsでのLambda関数の定時実行
CloudWatchEventsを使えば簡単に定時での処理が実装できます。

[ルールのスケジュール式(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html)

# Nuxt.js
ここからはフロントエンドの肝であるNuxtさんの記事をまとめています。

## 基本解説
Nuxt.jsについてわかりやすくまとめてくれています。まずはこちらから。

[Nuxt.jsチートシート](https://qiita.com/morrr/items/c01087e085986418615e)

## 本格導入に向けたまとめ記事
ある程度Nuxt.jsわかってきたなぁ、くらいの時に読むとよりしっくりNuxtさんのことが分かる内容になっております。

[Nuxt.jsの本格導入で遠回りしないためのTips v1.1](https://qiita.com/devneko/items/afe12b8acaf9648ccbb6)

## ★middlewareについて
middlewareはasyncDataやfetchよりも前に呼び出されるので、何よりもはじめに実行したい共通の関数を管理するイメージです。(例えば、ログインチェック等)
なんだかんだまずは公式を読んで理解を深めることがべたーかと思います。

[ミドルウェア(公式ドキュメント)](https://ja.nuxtjs.org/guide/routing#%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2)

## ★★middleware等で利用可能な引数(context)について
`asyncData`、`fetch`、`plugins`、`middleware`などで、引数として利用ができるcontextは知っているか知らないかで地味に変わってきますので、要チェックです。

[API: コンテキスト(公式ドキュメント)](https://ja.nuxtjs.org/api/context/)

## storeデータの永続化①
リロードするとリセットされてしまうstoreさん。そんな彼を救ってくれる方法が `vuex-persistedstate`です。

[nuxt.jsを使う時にlocalStorageでstoreを永続化する](https://qiita.com/sakapun/items/a0cf5698751ae70c8088)

## ページリロードにも対応するstoreの永続化②
`vuex-persistedstate`はローカルストレージを利用しているため、SSRだと保存されません。それに対して、こんな解決策がありました。

[nuxtServerInitを利用して、vuex-persistedstateの情報をCookieの値で更新する](https://dokuo.net/vue-js/vuex-persistedstate-with-nuxt-ssr/)

## ★★Vue.jsとNust.jsのライフサイクルとSSR/CSRの挙動
これは割と重要で、これによって動いたり動かなかったりがよくあるので、大枠の理解は必須です。

[Vue.js と Nuxt.js のライフサイクル早引きメモ](https://qiita.com/japboy/items/b67bae0bac1aeefb2680)
[Nuxt.jsにおけるサーバーサイドレンダリングの挙動とライフサイクル](https://nazo.hatenablog.com/entry/nuxt-ssr-lifecycle)

## headに埋め込んだscriptを実行
下記の記事のように埋め込み、関数を呼びたい場合は、`window.〇〇`で呼ぶ。

[外部リソースを使うには？(公式ドキュメント)](https://ja.nuxtjs.org/faq/)

## asyncDataとfetchの違い
混同しやすい部分なので、下記記事基準で統一することをおすすめします。

[Nuxt.jsのasyncDataとfetchは何が違うのか](https://qiita.com/Tsuyoshi84/items/2e47b7f5e7fb8c0c3c66)

## Vuexでのstateの監視方法
基本的には、storeとdataやasyncDataで対応しますが、どうしてもの時には使えます。

[Vuexでストアの状態を監視する方法は3つ](https://kawadev.net/vuex-watch/#tok-2)

## ★★Vue.jsでの子から親コンポーネントでの値の渡し方(props)
コンポーネント化をするにあたって必須の知識です。

[[図解]Vue.js2.x系で親子コンポーネント間でデータの受け渡しをする方法](https://kuroeveryday.blogspot.com/2016/10/vuejs-components-emit-events.html)

## Vue.Draggableでドラッグ＆ドロップでのリスト並び替え
便利です。

[Vue.Draggableを使ってサクッとTrelloっぽいものを作る](https://qiita.com/kimuray/items/d728fa1635aeacad359f)
[SortableJS(公式ドキュメント)](http://sortablejs.github.io/Sortable/)


## mixinsについての考え方
こちらの記事は、なんでも共通化すると、vueファイルの可読性が落ちるから、やりすぎは良くないよ、と教えてくれています。気をつけないとのちのちハマってしまうポイントになるので、頭の片隅に入れいています。

[俺がやらかしたVue mixinのアンチパターンから学ぶmixinの使い方と代替案](https://aloerina01.github.io/blog/2018-12-25-1)

# stripe
APIでこれだけのことが簡単にできる偉大さを使えば使うほどに感じています。サポートもレスポンス良くわかり易い回答をくれるので、困ったらサポートに問い合わせることをオススメします。

## stripe公式ドキュメント
stripeはなんだかんだ公式ドキュメントが充実しているので、やりたいことはたいてい公式ドキュメントに書かれています。

[Documentation](https://stripe.com/docs)

## stripe公式APIリファレンス
上記の公式ドキュメントでやりたいことに目星をつけて、より具体的に知りたい場合はこちら。大体、ドキュメントとリファレンスを何度も行き来する形になると思います。

[API Reference](https://stripe.com/docs/api)

## ★★Connectサービスについてのまとめ記事
stripeの日本法人で働いていた方のConnectサービスについてのまとめ記事です。決済だけでなく、振り込みを実装しようと思うとこのConnectの実装が必要になります。

[Stripe Connect 101](https://qiita.com/y_toku/items/7bfa42793801dfc5415d)

# AWS✕Nuxt.jsでのSSRの実装
Serverless Framework, Lambda, API Gateway, Express(※ここが肝)を使うことで、SSRの実装を比較的簡単に実装することができるらしい、、、。

## Serverless Frameworkの設定手順
細かく読み込んでいませんが、実際に導入を考える際の参考になる記事です。

[Serverless Frameworkの使い方まとめ](https://qiita.com/horike37/items/b295a91908fcfd4033a2)

## Serverless Framework, Lambda, API Gatewayの実装参考記事
[Alis](https://alis.to/) もこの仕組で実装されていますが、1つ目の記事を参考に、実装したそうです。この組み合わせは優秀な組み合わせっぽいですが、まだ実例は多くはありません。

[Nuxt.js on AWS Lambda with Serverless Framework](https://mya-ake.com/posts/nuxtjs-on-aws-lambda/)
[nuxt.js を serverless framework と一緒に使う](https://qiita.com/ooharabucyou/items/d53b4f06b8d055ef2292)
[Nuxt.js(v2.2.0)+TypeScriptなアプリをAWS Lambda+αにデプロイしてみた](https://cloudpack.media/44795)
[Serverless-Side Rendering With AWS Lambda & NuxtJS](https://medium.com/@fernalvarez/serverless-side-rendering-with-aws-lambda-nuxtjs-b94d15782af5)

# おわりに
Amplifyなどの便利なサービスを利用するためにも基礎的な各サービスの知識がないとフル活用できないことを実感している日々です。まとめただけですが、これからサイト制作を始める方の参考になれば、幸いです。