【AWS、Amplify】
Amplify
- ユーザープールIDなどを、Lambdaの環境変数から取得できる。
- amplify add functionしたときに、自動で環境変数が設定される。(他リソースを参照するかの質問にyesと答えておく必要がある。)
- aws-sdkで、戻りがAWS.Requestのメソッドを即実行する場合は、.promise()をつける。
await cognito.adminListGroupsForUser().promise()
- amplify add api時の設定で、APIへのアクセスを認証ユーザーのみに制限できる。(update apiであとからでもできる。)
? Restrict API access Yes
? Who should have access? Authenticated users only
LambdaからAppSyncのクエリを実行する
Runtime.ImportModuleErrorなどがでてどうしてもうまく行かない場合は、バージョンを疑う。バージョンの組み合わせ?などによってちゃんと動かない場合がある。
- 安定稼働が確認できているバージョン
"dependencies": {
"aws-appsync": "^3.0.3",
"graphql-tag": "^2.10.3",
"node-fetch": "^2.6.0"
},
graphqlのバージョンは15
- DynamoDB Streams をトリガーにLambdaを実行する
https://qiita.com/makishy/items/9bd2dd7d39cfed6a18d1
- Macでのamplify publishでエラー
project-config.jsonの以下を修正(.cmdを削除)
"BuildCommand": "npm.cmd run-script build",
"StartCommand": "npm.cmd run-script start"
API Gateway→Lambda
- ベースのパスを必ず設定すること(/v1など)
- 「/」をベースのパスとすると、ルート以外のルーティングがうまくされなくなってしまう
? Provide a path (e.g., /book/{isbn}): /v1
- APIにCognitoの認証を設定
? Restrict API access Yes
? Restrict access by? Auth/Guest Users
? Who should have access? Authenticated users only
- APIからLambdaに渡ってくる認証ユーザーのID
- event.requestContext.identity.cognitoAuthenticationProvider.split(':')[2]
- ローカルでfuncntionをテストする場合
amplify mock function <function名> --timeout 900
デフォルトではcloud formationの設定に関わらず10秒でタイムアウトしてしまうため、処理時間が長い関数の場合は--timeout <秒数>のオプションをつける。
AmplifyのAPIで{ withCredentials: true }
がサポートされている
AppSync、GraphQL
- フィールド名に別名をつけて取得
<別名>: <フィールド名>
query MyQuery {
listUsers {
items {
userId: id
name
}
}
}
type Post {
id: ID!
title: String!
...
tags: [String]
}
- 中間テーブルを使った多対多の定義
https://qiita.com/too/items/c77f1e5487d2497b5061#多対多
- 複合ソートキーでbetweenを使う
between: [
{
〇〇Id: "001",
createdAt: "2021-07-27T00:00:00.000"
},
{
〇〇Id: "001",
createdAt: "2021-07-27T23:59:99.999"
}
]
AppSync @connection
- 1→多のconnection
- User→[Post]
- 多→1のconnection
- Post→User
- name:, queryField:
- 多対多
- User - UserGroup - Group
- 中間テーブル
- 中間テーブルのid, gsi
- プライマリキー
- セカンダリインデックス
- @keyでname:を指定する
- LSI
- プライマリキーとパーティションキーが共通
- GSI
- プライマリキーとパーティションキーが異なる
- パーティションキー
- ソートキー
- 複合ソートキー
- @keyのnameにハイフンが使えない
- 複合ソートキー
多対多の定義
type User
@model
{
id: ID!
name: String!
userGroups: [UserGroup] @connection(keyName: "byUserId", fields: ["id"])
}
type Group
@model
{
id: ID!
groupName: String!
userGroups: [UserGroup] @connection(keyName: "byGroupId", fields: ["id"])
}
type UserGroup
@model
@key(fields: ["userId", "groupId"])
@key(name: "byUserId", fields: ["userId"])
@key(name: "byGroupId", fields: ["groupId"])
{
userId: ID!
groupId: ID!
user: User @connection(fields: ["userId"])
group: Group @connection(fields: ["groupId"])
}
Amplify GraphQL Transformer v1
Amplify GraphQL Transformer v2
バックエンドと分離したフロントエンドのソースからcodegenを実行する
custom authorization rules
custom authorizerでauthTokenにCognito Tokenを渡すと自動でCognito認証が使用される問題
LambdaからAppSync
サードパーティのtransformarを追加する
Unable to import custom transformer...
のエラーについて
- インストールにはyarnではなくnpmを使う
- Amplify CLIをYarnで入れている場合は一回削除してnpmで入れ直す。
amplify uninstall
rm /usr/local/bin/amplify
rm -rf /usr/local/lib/node_modules/\@aws-amplify/
- CI/CDを使っている場合はプロジェクトのディレクトリにもインストールしておく
Cognito
ユーザー作成コマンド
- アプリクライアントの「認証用の管理 API のユーザー名パスワード認証を有効にする (ALLOW_ADMIN_USER_PASSWORD_AUTH)」を有効にすること
- シークレットキーの設定が無いアプリクライアントを使用すること
PROFILE=<プロファイル> \
USERPOOLID=<ユーザープールID> \
CLIENTID=クライアントID \
EMAIL=<メールアドレス> \
PASSWORD=00000000 \
aws cognito-idp admin-create-user \
--profile ${PROFILE} \
--user-pool-id ${USERPOOLID} \
--username ${EMAIL} \
--message-action SUPPRESS \
--temporary-password ${PASSWORD} \
SESSION=$(aws cognito-idp admin-initiate-auth \
--profile ${PROFILE} \
--user-pool-id ${USERPOOLID} \
--client-id ${CLIENTID} \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--auth-parameters USERNAME=${EMAIL},PASSWORD=${PASSWORD} \
--query "Session" | sed "s/\"//g") \
aws cognito-idp admin-respond-to-auth-challenge \
--profile ${PROFILE} \
--user-pool-id ${USERPOOLID} \
--client-id ${CLIENTID} \
--challenge-name NEW_PASSWORD_REQUIRED \
--challenge-responses NEW_PASSWORD=${PASSWORD},USERNAME=${EMAIL} \
--session ${SESSION}
CognitoでEmail変更するときに間違ったメールアドレスを入力するとアカウントロックされる問題
解消
メール認証のリンクから指定ページにリダイレクト
Logger
amplify override
getProjectInfoでenvの情報が取れるらしいが、現状動作しない。
import { AmplifyRootStackTemplate, getProjectInfo } from '@aws-amplify/cli-extensibility-helper'
export function override(resources: AmplifyRootStackTemplate) {
const { envName, projectName } = getProjectInfo()
issue
もしParametersにenvが渡ってきているリソースなら、const refEnv = { Ref: 'env' }とすればいい
functionでPythonをデプロイしようとしたらエラーになる
You must have pipenv installed and available on your PATH as "pipenv". It can be installed by running "pip3 install --user pipenv".
You must have virtualenv installed and available on your PATH as "venv". It can be installed by running "pip3 install venv".
pipenvをインストール
pip3 install --user pipenv
virtualenvがちゃんと入っているはずなのにエラーになる
virtualenvを再インストールする
pip3 uninstall virtualenv
sudo pip3 install virtualenv
それでもうまく行かない。pip3 uninstall virtualenvをしても何故かvirtualenvが残っていた。
which virtualenv
→ /usr/local/bin/virtualenv
ディレクトリを指定して削除して再インストールしてみるとデプロイできるようになった。
sudo rm -rf /usr/local/bin/virtualenv
pip3 uninstall virtualenv
sudo pip3 install virtualenv
serverless
Code Commit
Step Functions