DynamoDB Python 쿼리

Abid Ullah 2024년2월15일
  1. DynamoDB 소개
  2. Boto3 소개
  3. Boto3를 사용하여 DynamoDB에서 테이블 생성
  4. Boto3를 통해 DynamoDB에서 테이블 삭제
  5. Boto3를 통해 DynamoDB의 테이블 나열
  6. Boto3를 통한 DynamoDB의 페이지 매김
  7. Boto3를 통해 DynamoDB에서 정렬
  8. Boto3를 통해 DynamoDB에서 항목 가져오기
  9. Boto3를 통해 DynamoDB의 항목 스캔
  10. DynamoDB의 글로벌 보조 인덱스
  11. Boto3를 사용하여 DynamoDB 테이블 백업
  12. 결론
DynamoDB Python 쿼리

이 기사에서는 Python을 사용하여 Amazon DynamoDB를 쿼리하는 방법에 대해 설명합니다. 또한 Boto3의 내용과 DynamoDB를 쿼리해야 하는 이유에 대해서도 논의할 것입니다.

DynamoDB 소개

DynamoDB는 내장 보안 메커니즘, 연속 백업, 메모리 캐싱 및 유용한 데이터 가져오기/내보내기 도구를 제공하는 NoSQL 데이터베이스 서비스입니다.

DynamoDB는 AWS 리전의 여러 가용 영역(AZ) 간에 자동으로 데이터를 복제하여 중단 및 데이터 손실에 대한 보안을 강화합니다. 세분화된 액세스 제어, 미사용 암호화, 사용자 활동 기록을 포함하여 DynamoDB에서 다양한 보안 기능을 사용할 수 있습니다.

Boto3 소개

Boto3는 Amazon Web Services(AWS)용으로 개발된 내장 Python 라이브러리입니다. 이 라이브러리는 DynamoDB를 포함하여 Amazon의 다양한 서비스를 상호 작용, 생성, 구성, 관리 및 사용하는 데 유용합니다.

Boto3 설치 및 가져오기

Python 워크벤치에 Boto3 라이브러리를 설치하려면 다음 명령을 사용합니다.

pip install boto3

출력:

Boto3 설치

암호:

import boto3

이렇게 하면 boto3 라이브러리를 노트북으로 가져옵니다.

DynamoDB에 Boto3 연결

다음 코드를 사용하여 Boto3를 사용하여 DynamoDB에 연결합니다.

암호:

import boto3

client = boto3.client(
    "dynamodb",
    aws_access_key_id="yyyy",
    aws_secret_access_key="xxxx",
    region_name="us-east-1",
)

Python Boto3 라이브러리를 통해 연결하려면 데이터베이스가 AWS DynamoDB에 이미 생성되어 있어야 합니다.

Boto3를 사용하여 DynamoDB에서 테이블 생성

DynamoDB의 테이블은 여러 가지 방법으로 생성할 수 있습니다. 여기에는 Amazon CLI, AWS 콘솔 사용 또는 Boto3 사용이 포함됩니다.

여기에서는 앞에서 언급한 단계에 따라 이미 연결된 데이터베이스와 함께 Boto3를 사용합니다. DynamoDB 클라이언트와 테이블 리소스가 어떻게 다른지 알면 필요에 따라 둘 중 하나를 사용할 수 있습니다. 이 테이블 리소스는 일부 작업을 상당히 단순화할 수 있기 때문입니다.

개발자는 boto3.resource('dynamodb') 리소스를 사용하여 DynamoDB 테이블과 모든 콘텐츠를 생성, 업데이트 및 삭제할 수 있습니다. 이 리소스는 조건식 및 테이블 수준 보안을 사용하여 항목 수준 보안을 지원합니다.

DynamoDB 데이터에 대한 서버리스 액세스의 경우 AWS Lambda 함수와 함께 boto3.resource('dynamodb') 리소스를 활용하십시오.

import boto3

dynamodb = boto3.resource("dynamodb", region_name="us-west-2")

table = dynamodb.create_table(
    TableName="Movies",
    KeySchema=[
        {"AttributeName": "year", "KeyType": "HASH"},  # Partition key
        {"AttributeName": "title", "KeyType": "RANGE"},  # Sort key
    ],
    AttributeDefinitions=[
        {"AttributeName": "id", "AttributeType": "N"},
        {"AttributeName": "createdAt", "AttributeType": "S"},
    ],
    ProvisionedThroughput={"ReadCapacityUnits": 10, "WriteCapacityUnits": 10},
)
print("Table status:", table.table_status)

Boto3를 통한 테이블 생성이 활성화되고 표시되기까지 약간의 시간이 걸립니다. 재시도하기 전에 약간의 대기가 권장되거나 waiter 기능을 사용하여 테이블이 활성화될 때 알려줄 수 있습니다.

import botocore.session

session = botocore.session.get_session()
dynamodb = session.create_client(
    "dynamodb", region_name="us-east-1"
)  # low-level client

waiter = dynamodb.get_waiter("table_exists")
waiter.wait(TableName="my-table-name")

Boto3를 통해 DynamoDB에서 테이블 삭제

DynamoDB에서 테이블을 삭제하는 것은 매우 간단합니다. 마음이 바뀌어 데이터베이스에서 테이블을 삭제하려면 다음 코드 스니펫을 입력해야 합니다.

import boto3

dynamodb = boto3.resource("dynamodb", region_name="us-east-1")

dynamodb.delete_table(TableName="Movies")

삭제하려는 테이블이 동일한 이름의 데이터베이스에 이미 존재하거나 오류 메시지(테이블을 찾을 수 없음)가 표시됩니다.

Boto3를 통해 DynamoDB의 테이블 나열

우리 지역에서 사용 가능한 모든 테이블 목록을 찾는 데 관심이 있는 경우 list() 함수를 사용하여 지역에서 사용 가능한 모든 테이블을 나열해야 합니다.

import boto3

dynamodb = boto3.resource("dynamodb", region_name=region)

tables = list(dynamodb.tables.all())
print(tables)

총 테이블 수가 100개 미만인지 확인해야 합니다. 그렇지 않으면 목록을 통해 페이지를 매겨야 합니다.

Boto3를 통한 DynamoDB의 페이지 매김

단일 목록 호출은 최대 1MB의 항목에 대한 결과를 반환합니다. 추가 목록을 보려면 두 번째 전화를 걸어야 합니다. LastEvaluatedKey가 응답 개체에 있는 경우 이 테이블에서 더 많은 항목을 가져오려면 ExclusiveStartKey를 사용하여 또 다른 호출을 수행해야 합니다.

dynamodb = boto3.resource("dynamodb", region_name=region)

table = dynamodb.Table("my-table")

response = table.query()
data = response["Items"]

# LastEvaluatedKey indicates that there are more results
while "LastEvaluatedKey" in response:
    response = table.query(ExclusiveStartKey=response["LastEvaluatedKey"])
    data.update(response["Items"])

Boto3를 통해 DynamoDB에서 정렬

데이터베이스 측면에서 DynamoDB는 결과를 정렬하는 한 가지 방법만 제공합니다. 항목 정렬 기능은 테이블에 결과가 없는 경우 결과를 수신한 후 애플리케이션 코드에서 수행하는 것으로 제한됩니다.

그러나 다음 구문을 사용하여 내림차순 또는 오름차순 정렬 키를 사용하여 DynamoDB 결과를 정렬할 수 있습니다.

import boto3

dynamodb = boto3.resource("dynamodb", region_name=region)

table = dynamodb.Table("my-table")

# true = ascending, false = descending
response = table.query(ScanIndexForward=False)
data = response["Items"]

Boto3를 통해 DynamoDB에서 항목 가져오기

GetItem() 함수는 DynamoDB 데이터베이스에서 특정 항목을 가져오려는 경우에 사용됩니다.

import boto3

dynamodb = boto3.resource("dynamodb", region_name=region)

table = dynamodb.Table("my-table")

response = table.get_item(Key={primaryKeyName: "ID-1", sortKeyName: "SORT_2"})

Boto3를 통해 DynamoDB의 항목 스캔

테이블의 모든 정보는 스캔을 통해 액세스할 수 있습니다. 데이터는 테이블의 각 항목을 읽은 후 scan() 메서드에 의해 반환됩니다.

테이블 스캔 작업은 FilterExpression과 같은 다른 선택 항목을 추가할 때 더 적은 수의 원하는 결과를 반환할 수 있습니다.

from boto3.dynamodb.conditions import Key, Attr
import boto3

dynamodb = boto3.resource("dynamodb")

table = dynamodb.Table("Employees")

response = table.scan()
response["Items"]

print(response)

# or


dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("Employees")

response = table.scan(FilterExpression=Attr("Department").eq("IT"))

print("The query returned the following items:")
for item in response["Items"]:
    print(item)

DynamoDB의 글로벌 보조 인덱스

글로벌 보조 인덱스를 사용하여 기본 테이블의 기본 키에 포함되지 않은 속성을 쿼리할 수 있습니다. 이렇게 하면 전체 테이블 스캔 절차로 인한 지연과 비효율성을 피할 수 있습니다.

글로벌 보조 인덱스는 기본 테이블의 속성도 포함하지만 다른 기본 키를 사용하여 구조화되어 쿼리 속도가 빨라집니다.

Boto3를 사용하여 DynamoDB 테이블 백업

Boto3를 사용하여 DynamoDB 테이블에 대한 온디맨드 백업을 생성하려면 create_backup() 메서드를 활용하고 테이블 이름과 함께 대상 백업 테이블 이름을 전달합니다.

import boto3

client = boto3.client("dynamodb")

response = client.create_backup(TableName="Employees", BackupName="Employees-Backup-01")
print(response)

결론

이 기사에서는 Python Boto3를 사용하여 DynamoDB 테이블을 쿼리하고 Amazon DynamoDB에서 기타 CRUD 활동을 생성, 나열 및 수행하고 기타 유지 관리 작업을 수행하는 방법을 설명했습니다.

작가: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn