0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LambdaからDynamoDBに接続してみる

Posted at

目的

AWS Certified Developer - Associateの勉強をしている中で
理解が浅いサービスについて実際に使用してみます

今回はLambdaからDynamoDBに接続してデータを取得するまでをやってみます
DynamoDBのデータ取得方法の違いについても確認します

LambdaとDynamoDBは以下で作成したものを使用します
https://qiita.com/tsubaki_019475/items/70ab982f3ee329978383
https://qiita.com/tsubaki_019475/items/f40c65b43103f4a9f8e4

手順

  • ロール付与
  • Lambda関数の実行
  • API Gatewayを使用した接続

ロール付与

Lambda関数の権限をデフォルトで作成した場合、DynamoDBの権限がないため設定を追加します
1. Lambdaのページに移動、左のメニューから関数を選択
2. 作成したlambda関数を選択
今回は事前に作成していたtest_lambdaを選択しています

3. タブから設定、左のメニューからアクセス権限を選択、ロール名を選択
ロール名を選択することでlambdaに設定してあるロールの設定ページへ移動できます

4. 許可を追加からポリシーをアタッチ
今回はDynamoDBからデータの取得のみ行えればよいので、AmazonDynamoDBReadOnlyAccessを追加しています
許可ポリシーに追加したポリシーが表示されていれば成功です

image.png

Lambda関数の実行

DynamoDBとlambda関数は以前作成したものを使用します

lambda関数

関数名:test_lambda

DynamoDB

テーブル名:test_book
パーティションキー:id

image-3.png

テーブル名:test_book2
パーティションキー:id
ソートキー:category

image-1.png

取得方法はいくつかあります
それぞれの違いは以下のような感じです

  • scan
    全件取得
    scanでもデータを絞ることはできるが、あくまで全件取得後に絞り込んでいる

  • query
    キーを条件に検索できる
    条件にはパーティションキーが含まれる必要がある

  • get_item
    プライマリキーを条件に1つのデータを取得することができる

  • batch_get_item
    プライマリキーを条件に複数のデータを取得することができる

それぞれのコード例と結果は以下になります
コード実行時は作成したLambda関数のページからTestを実行しています

image-4.png

scan

コード

import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("test_book2")

def lambda_handler(event, context):
    response = table.scan()
    return response['Items']

結果

[
  {
    "category": "1",
    "id": "2",
    "name": "book3"
  },
  {
    "category": "1",
    "id": "1",
    "name": "book1"
  },
  {
    "category": "2",
    "id": "1",
    "name": "book2"
  }
]

query

コード

import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("test_book2")

def lambda_handler(event, context):
    response = table.query(
        KeyConditionExpression=Key('id').eq('1')
    )
    return response['Items']

結果

[
  {
    "category": "1",
    "id": "1",
    "name": "book1"
  },
  {
    "category": "2",
    "id": "1",
    "name": "book2"
  }
]

ソートキーであるcategoryを検索条件にするとidが検索条件にないというエラーが発生しました

コード

KeyConditionExpression=Key('category').eq('1')

結果

"An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: id"

get_item

コード

import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("test_book2")

def lambda_handler(event, context):
    response = table.get_item(
        Key={
            'id': '1',
            'category': '2'
        }
    )

    return response['Item']

結果

{
  "category": "2",
  "id": "1",
  "name": "book2"
}

Keyの指定をidのみのするとプライマリキーにならないためかエラーになりました

コード

        Key={
            'id': '1'
        }

結果

An error occurred (ValidationException) when calling the GetItem operation: The provided key element does not match the schema

batch_get_item

コード

import boto3
dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):
    response = dynamodb.batch_get_item(
        RequestItems={
            'test_book2': {
                'Keys': [
                    {
                        'id': '1',
                        'category': '2'
                    },
                    {
                        'id': '2',
                        'category': '1'
                    }
                ]
            },
            'test_book': {
                'Keys': [
                    {
                        'id': '1'
                    }
                ]
            }
        }
    )

    return response['Responses']


結果

{
  "test_book2": [
    {
      "category": "2",
      "id": "1",
      "name": "book2"
    },
    {
      "category": "1",
      "id": "2",
      "name": "book3"
    }
  ],
  "test_book": [
    {
      "value": 100,
      "id": "1",
      "name": "book1"
    }
  ]
}

API Gatewayを使用した接続

以前作成したAPI GatewayのURLへアクセスするとDynamoDBのデータを確認できました

image-5.png

URLを忘れた場合はAPI Gatewayの左のメニューのステージから確認できます

image-6.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?