Open8

Lamda×DynamoDB×LINEボット

たけだたけだ

環境

  • Windows10 Pro
    • バージョン 21H1
    • OSビルド 19043.1052
  • Node.js v14.15.0
  • npm 6.14.8
  • Git version 2.28.0.windows.1
たけだたけだ

AWS CLIインストール

[ダウンロードサイト](https:// docs. aws. amazon. com/ ja_ jp/ cli/ latest/ userguide/ awscli-install-windows. html)

MSIインストーラーをダウンロード
Windows用のAWSCLI MSIインストーラー(64ビット)

ダウンロードしたMSIインストーラーを実行
Image from Gyazo

Image from Gyazo

Image from Gyazo

画面の指示に従います。デフォルトでは、AWS CLIバージョン1はC:\Program Files\Amazon\AWSCLI(64ビットバージョン)に インストールされます 。
Image from Gyazo

Image from Gyazo

インストール完了
Image from Gyazo

C:\> aws --version
aws-cli/1.19.96 Python/3.6.0 Windows/10 botocore/1.20.96
たけだたけだ

LINEボットアカウント作成
Image from Gyazo

  • 応答メッセージ 無効
  • チャネルアクセストークン(ロングターム) 発行
たけだたけだ

IAMユーザー作成

  • line-dev-admin
    • 管理ポリシー
      • AWSLambda_FullAccess
      • AmazonAPIGatewayAdministrator
      • AmazonCognitoPowerUser
      • AWSCertificateManagerFullAccess
    • line-dev-user
      • インラインポリシー
        • Lambda
        • 読み込み GetFunction
        • 書き込み UpdateFunctionCode
        • UpdateFunctionConfiration
      • リソースでfunctionを指定

なぜAmazonCognitoPowerUserが必要か?
API Gatewayでは「オーガナイザー」と呼ばれるAPI Gatewayへのアクセス権限をCognite認証機能を用いて制限する機能があり、それをインプリメントするのに必要なIAM権限。この権限がないとAPI Gatewayデプロイ時にエラーが出る。
→いまいちオーガナイザーの意味がわからん。。

なぜAWSCertificateManagerFullAccessが必要か?
API Gatewayではクライアント証明書生成ができます。またACM(AmazonCertificateManager)証明書で認められたカスタムドメイン名を作成することができます。CA証明書をAWSが代理で作成および管理してくれる機能。この権限がないとAPI Gatewayデプロイ時にエラーが出る。

たけだたけだ

ロール作成

  • lambda_basic_execustion
    • AWSLambdaBasicExecutionRole
  • lambda_dynamodb_read
    • AWSLambdaBasicExecutionRole
    • DynamoDBからデータを読み込めるロール
    • インラインポリシー lambda_dynamodb_read_Inlinepolicy
      • サービス DynamoDB
      • アクション 読み込み(すべて)
      • リソース すべてのリソース
    • lambda_dynamodb_write
      • AWSLambdaBasicExecutionRole
      • DynamoDBにデータを書き込めるロール
      • インラインポリシー lambda_dynamodb_write_Inlinepolicy
        • サービス DynamoDB
        • アクション
          • リスト
          • 読み込み
          • 書き込み
        • リソース すべてのリソース
    • apigateway_logto_cloudwatch
      • AmazonAPIGatewayPushToCloudWatchLogs
たけだたけだ

aws-cli初期設定

line-dev-user作成時にダウンロードしたCSVを開いておく

Git Bashで以下を実行

$ aws configure --profile line-dev-user
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

このコマンド打つと~/.awsフォルダの中のファイルに書き込まれるっぽい。間違えたらこれを削除するか上書きすればよさそう。
Image from Gyazo

line_dev_admin用のプロファイルも作成

$ aws configure --profile line-dev-admin
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

参照は以下のコマンドで確認できる

$ aws configure list --profile line-dev-user
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile            line-dev-user           manual    --profile
access_key     ****************SEMX shared-credentials-file
secret_key     ****************0TBI shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

$ aws configure list --profile line-dev-admin
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile           line-dev-admin           manual    --profile
access_key     ****************Y4TH shared-credentials-file
secret_key     ****************WMUU shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

デフォルトのユーザーを指定

$ export AWS_DEFAULT_PROFILE=line-dev-user

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile            line-dev-user              env    ['AWS_DEFAULT_PROFILE', 'AWS_PROFILE']
access_key     ****************SEMX shared-credentials-file
secret_key     ****************0TBI shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

ただし、このデフォルトのユーザーはBashを閉じると設定が消えるので恒久的に変更したい場合には環境変数でユーザー環境変数に
変数:AWS_AWS_DEFAULT_PROFILE
値:line-dev-user
みたいな感じで登録すればいいらしい。

たけだたけだ

Lambda関数作成

Image from Gyazo

環境変数にLINE Messaging APIのチャネルアクセストークンを追加
Image from Gyazo

PCローカルの作業用フォルダで以下を実行

pwsh
PS C:\Users\607\code\20210618_lambda_dynamodb_linebot> npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (20210618_lambda_dynamodb_linebot)
version: (1.0.0)
description: AWS LambdaとDynamoDBでLINEボット
entry point: (index.js)
test command:
git repository:
keywords:
author: kahori_takeda
license: (ISC)
About to write to C:\Users\607\code\20210618_lambda_dynamodb_linebot\package.json:

{
  "name": "20210618_lambda_dynamodb_linebot",
  "version": "1.0.0",
  "description": "AWS LambdaとDynamoDBでLINEボット",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "kahori_takeda",
  "license": "ISC"
}


Is this OK? (yes) yes
PS C:\Users\607\code\20210618_lambda_dynamodb_linebot> npm i @line/bot-sdk
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN 20210618_lambda_dynamodb_linebot@1.0.0 No repository field.

+ @line/bot-sdk@7.3.0
added 42 packages from 85 contributors and audited 42 packages in 11.012s

6 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

PS C:\Users\607\code\20210618_lambda_dynamodb_linebot> ls

    Directory: C:\Users\607\code\20210618_lambda_dynamodb_linebot

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2021/06/21     0:03                node_modules
-a---          2021/06/21     0:03          12168 package-lock.json
-a---          2021/06/21     0:03            333 package.json