読みにくい、間違い等ありましたらご指摘いただけますと幸いです。
対象読者
- LambdaとCloudWatchがどんなものかなんとなく分かっているけど、
- どのように実装していくか分からんという方
- どういう時に使うのか分からんという方
事前準備、開発環境
[事前準備]
ReactNativeで環境構築したプロジェクトのディレクトリで、
こちらを参考にして、amplify configure、amplify init、amplify add authを叩いて事前準備する。
[開発環境]
- react-native v0.66.5
- amplify-cli v9.2.1
- @aws-amplify/api v5.0.11
- @aws-amplify/api-graphql v3.0.11
- @aws-amplify/auth v5.1.5
- @aws-amplify/core v5.0.11
amplify configure、amplify init、amplify add authを叩いて事前準備する。
https://dev.classmethod.jp/articles/how-to-set-up-web-application-base-with-amplify/
どのような開発に使ったか
毎日指定時間に、DynamoDBからデータを取得してpush通知を送る。
手順
1.amplify pull
初回ではない場合、リモートの差分を取り込む。
2.amplify add function
このコマンドを叩いてLambda関数を作成すること。既存のものをコピペして作成するとうまくいかないため。
何度か質問されますが、今回は以下の通り設定しました。
? Select which capability you want to add:
Lambda function (serverless function)
? Provide an AWS Lambda function name:
任意の関数名を設定
? Choose the runtime that you want to use:
NodeJS
? Choose the function template that you want to use:
Hello World (いくつかあるが、今回はとりあえず関数を作りたいので)
↓この後はHelloWorldを選択したときの設定です。
? Do you want to configure advanced settings?
No
? Do you want to access other resources in this project from your Lambda function? (Y/n)
No
作成完了すると、amplify > backend > function配下に関数が追加されている。
3.amplify status
作成した関数がOperation Createで差分として出ているか確認。
変更していない関数に差分が出ていないかも同時に確認。
4.amplify push function 関数名
新規作成した関数をpushする。
正常にpushされれば、赤文字が出ない。新規作成は白文字で表示されるかも。
5.ブラウザからpushした関数を確認、テスト実行
Lambda > 関数を開き、先ほどpushした関数があることを確認する。
テストを押すと、テストの新規作成が出てくる。
とりあえず、正常にテストできるか確認したいので、任意のイベント名を押して保存。
テスト > テストボタンを押すと先ほど作成したテストが実行できる。
正常に動作すると緑の表示、失敗すると画像のように赤の表示がされる。
6.ログの確認
モニタリング > View CloudWatch logsから実行したテストのログが確認できる。
※確認前にLambda > 関数 > 設定 > 環境変数を適宜追加すること。
この後、Lambda関数を更新するには
ローカルで修正し、amplify pushする。
開発中に遭遇したエラー達と解決方法
- node_modulesを含む関数がうまくuploadできず "errorType":"Runtime.ImportModuleError”が出る場合
[解決方法]
関数をzip化して、コード > アップロード元 > .zipファイルからアップロードした方が早い。amplify pushすると、なぜかnode_modules配下のパッケージたちが.yarn-integrityファイルのみになってしまう。謎。zip化は関数のディレクトリで以下を叩く。
zip -r 関数名.zip .
-
amplify > backend > function 配下の関数を右クリックして削除したが、amplify statusで確認すると残っている時
[解決方法]
amplify remove functionで削除したい関数を選択して削除。 -
テストを実行したときに、次のようなエラーが出たとき
プロジェクト名LambdaRolexxxxxxxx-dev/Lambda関数名-dev is not authorized to perform: dynamodb: Query on resource: arn:aws:dynamodb~~
[解決方法]
I AM > ロール > プロジェクト名LambdaRolexxxxxxxx-dev の許可ポリシーに必要なもののアクセス許可をする、今回はDynamoDBのテーブルデータを取得したくてAmazonDynamoDBFullAccessを追加。
AmazonDynamoDBReadOnlyAccessこっちでもいけた。 -
ValidationException Query key condition not supported
IndexNameを追加したら、いけた。
アクセスするDynamoDBのテーブル > インデックス > グローバルセカンダリインデックスにある名前を追加。
return new Promise((resolve, reject) => {
dynamo.query(
{
TableName: '関数名',
KeyConditionExpression: '#TYPE = :type AND #DATE = :today',
ExpressionAttributeNames: { '#TYPE': 'type', '#DATE': 'date' },
ExpressionAttributeValues: {
':today': today,
':type': type,
},
IndexName: 'ここ',
},
function (err, data) {
if (err) reject(err)
resolve(data)
},
)
})