Open62

【AWS、Amplify】

kokotakokota

Amplify

kokotakokota
  • ユーザープール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
kokotakokota

https://www.farend.co.jp/blog/2020/11/aws-appsync/

LambdaからAppSyncのクエリを実行する

Runtime.ImportModuleErrorなどがでてどうしてもうまく行かない場合は、バージョンを疑う。バージョンの組み合わせ?などによってちゃんと動かない場合がある。

  • 安定稼働が確認できているバージョン
"dependencies": {
  "aws-appsync": "^3.0.3",
  "graphql-tag": "^2.10.3",
  "node-fetch": "^2.6.0"
},

graphqlのバージョンは15
https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/691

kokotakokota
  • Macでのamplify publishでエラー
    project-config.jsonの以下を修正(.cmdを削除)
    "BuildCommand": "npm.cmd run-script build",
    "StartCommand": "npm.cmd run-script start"
kokotakokota

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]
kokotakokota
  • ローカルでfuncntionをテストする場合
amplify mock function <function名> --timeout 900

デフォルトではcloud formationの設定に関わらず10秒でタイムアウトしてしまうため、処理時間が長い関数の場合は--timeout <秒数>のオプションをつける。

kokotakokota

AppSync、GraphQL

kokotakokota
  • フィールド名に別名をつけて取得
    <別名>: <フィールド名>
query MyQuery {
  listUsers {
    items {
      userId: id
      name
    }
  }
}
kokotakokota
  • 複合ソートキーでbetweenを使う
      between: [
        {
          〇〇Id: "001",
          createdAt: "2021-07-27T00:00:00.000"
        },
        {
          〇〇Id: "001",
          createdAt: "2021-07-27T23:59:99.999"
        }
      ]
kokotakokota

AppSync @connection

  • 1→多のconnection
    • User→[Post]
  • 多→1のconnection
    • Post→User
    • name:, queryField:
  • 多対多
    • User - UserGroup - Group
    • 中間テーブル
    • 中間テーブルのid, gsi
kokotakokota
  • プライマリキー
  • セカンダリインデックス
    • @keyでname:を指定する
    • LSI
      • プライマリキーとパーティションキーが共通
    • GSI
      • プライマリキーとパーティションキーが異なる
  • パーティションキー
  • ソートキー
    • 複合ソートキー
      • @keyのnameにハイフンが使えない
kokotakokota

多対多の定義

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"])
}
kokotakokota

サードパーティのtransformarを追加する
https://docs.amplify.aws/cli-legacy/graphql-transformer/directives/

Unable to import custom transformer...のエラーについて
https://github.com/flogy/graphql-ttl-transformer/issues/18

  • インストールにはyarnではなくnpmを使う
  • Amplify CLIをYarnで入れている場合は一回削除してnpmで入れ直す。
amplify uninstall
rm /usr/local/bin/amplify
rm -rf /usr/local/lib/node_modules/\@aws-amplify/
  • CI/CDを使っている場合はプロジェクトのディレクトリにもインストールしておく
kokotakokota

Cognito

kokotakokota

ユーザー作成コマンド

  • アプリクライアントの「認証用の管理 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}
kokotakokota

amplify override

kokotakokota

getProjectInfoでenvの情報が取れるらしいが、現状動作しない。

import { AmplifyRootStackTemplate, getProjectInfo } from '@aws-amplify/cli-extensibility-helper'

export function override(resources: AmplifyRootStackTemplate) {
  const { envName, projectName } = getProjectInfo()

issue
https://github.com/aws-amplify/amplify-cli/issues/9063

kokotakokota

もしParametersにenvが渡ってきているリソースなら、const refEnv = { Ref: 'env' }とすればいい

kokotakokota

functionでPythonをデプロイしようとしたらエラーになる

kokotakokota
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".
kokotakokota

virtualenvがちゃんと入っているはずなのにエラーになる

kokotakokota

virtualenvを再インストールする

pip3 uninstall virtualenv
sudo pip3 install virtualenv
kokotakokota

それでもうまく行かない。pip3 uninstall virtualenvをしても何故かvirtualenvが残っていた。

which virtualenv 
→ /usr/local/bin/virtualenv

ディレクトリを指定して削除して再インストールしてみるとデプロイできるようになった。

sudo rm -rf /usr/local/bin/virtualenv
pip3 uninstall virtualenv
sudo pip3 install virtualenv
kokotakokota

Code Commit

kokotakokota

異なるAWSアカウントのCodeCommitリポジトリをクローンするときに、認証をプロファイルで分ける。
https://dev.classmethod.jp/articles/access-multiple-codecommit-repositories-with-credential-helper/
上記対応後に、CodeCommitへのアクセスが403になる場合、gitconfigが複数存在していて、いずれかが邪魔している可能性がある。

以下コマンドでgitconfigを検索できる。
git config -l --show-origin | grep credential
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/troubleshooting-ch.html

kokotakokota

API Gateway

kokotakokota

コンソールのメソッドテストでAPIのテストをするときに、Lambdaでリクエストボディが取れない場合、ヘッダーでContent-Typeを指定する