집에가고싶은사람의 블로그

[AWS A3](AWS Auto Scaling Group) 본문

IT/AWS, DB

[AWS A3](AWS Auto Scaling Group)

집에 가고싶어요 2024. 8. 26. 13:05
728x90

목차

  • 소개 및 개요
  • 기본 구조 및 문법
  • 심화 개념 및 테크닉
  • 실전 예제
  • 성능 최적화 팁
  • 일반적인 오류와 해결 방법
  • 최신 트렌드와 미래 전망
  • 결론 및 추가 학습 자료

소개 및 개요

AWS A3(AWS Auto Scaling Group)는 EC2 인스턴스의 개수를 자동으로 조정하여 애플리케이션의 가용성과 확장성을 높이는 서비스입니다. A3를 사용하면 트래픽 변화에 따라 인스턴스 수를 동적으로 늘리거나 줄일 수 있어 비용 최적화와 안정적인 성능을 동시에 달성할 수 있습니다.

A3의 기본 구성 요소는 Launch Configuration과 Auto Scaling Group입니다. Launch Configuration은 인스턴스 생성 시 필요한 AMI, 인스턴스 타입, 보안 그룹 등의 설정을 정의하고, Auto Scaling Group은 이를 바탕으로 인스턴스 수를 조정합니다. 다음은 Boto3를 사용하여 Launch Configuration을 생성하는 예제 코드입니다:


import boto3

autoscaling = boto3.client('autoscaling')

response = autoscaling.create_launch_configuration(
    LaunchConfigurationName='my-launch-config',
    ImageId='ami-0c55b159cbfafe1f0',
    InstanceType='t2.micro',
    KeyName='my-key-pair',
    SecurityGroups=['sg-903004f8']
)

위 코드에서는 'my-launch-config'라는 이름의 Launch Configuration을 생성하며, AMI ID, 인스턴스 타입, 키 페어, 보안 그룹을 설정합니다. 이렇게 생성된 Launch Configuration을 바탕으로 Auto Scaling Group을 생성할 수 있습니다:


response = autoscaling.create_auto_scaling_group(
    AutoScalingGroupName='my-asg',
    LaunchConfigurationName='my-launch-config',
    MinSize=1,
    MaxSize=3,
    DesiredCapacity=2,
    AvailabilityZones=['us-east-1a', 'us-east-1b']
)

'my-asg'라는 이름의 Auto Scaling Group을 생성하며, 최소 1개, 최대 3개의 인스턴스를 유지하도록 설정하고, 초기 인스턴스 수는 2개로 지정합니다. 인스턴스는 'us-east-1a'와 'us-east-1b' 가용 영역에 고르게 분산됩니다.

A3의 가장 큰 장점은 조정 정책(Scaling Policy)을 통해 인스턴스 수를 동적으로 조절할 수 있다는 점입니다. CPU 사용률, 네트워크 입출력 등 다양한 지표를 기반으로 조정 정책을 설정하면 A3가 자동으로 인스턴스 수를 조정합니다. 다음은 CPU 사용률을 기준으로 조정 정책을 생성하는 예제입니다:


response = autoscaling.put_scaling_policy(
    AutoScalingGroupName='my-asg',
    PolicyName='scale-out-policy',
    PolicyType='TargetTrackingScaling',
    TargetTrackingConfiguration={
        'PredefinedMetricSpecification': {
            'PredefinedMetricType': 'ASGAverageCPUUtilization'
        },
        'TargetValue': 50.0
    }
)

위 코드는 'my-asg' Auto Scaling Group에 'scale-out-policy'라는 이름의 조정 정책을 생성합니다. 이 정책은 그룹 내 인스턴스들의 평균 CPU 사용률을 50%로 유지하도록 인스턴스 수를 조정합니다. 만약 CPU 사용률이 50%를 초과하면 새로운 인스턴스가 추가되고, 50% 미만으로 떨어지면 인스턴스가 제거됩니다.

이렇게 A3를 활용하면 트래픽 변화에 능동적으로 대응하면서도 불필요한 비용 낭비를 막을 수 있습니다. 특히 트래픽 변동이 심한 웹 서비스, 배치 처리 애플리케이션 등에서 A3의 효과를 극대화할 수 있습니다.

지금까지 AWS A3의 기본 개념과 중요성, 실제 사용 사례를 간단한 코드 예제와 함께 살펴보았습니다. 다음 섹션에서는 A3를 활용한 보다 심화된 구성 방법과 모범 사례에 대해 알아보겠습니다.

기본 구조 및 문법

AWS A3의 기본 구조와 문법에 대해 알아보겠습니다. A3는 YAML 형식을 사용하여 AWS 리소스를 정의하고 관리합니다. 다음은 간단한 A3 코드 예제입니다.


Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0c55b159cbfafe1f0
      InstanceType: t2.micro

위 코드는 AWS EC2 인스턴스를 정의하는 예제입니다. Resources 섹션 아래에 리소스 이름 (MyEC2Instance)을 지정하고, 해당 리소스의 유형 (Type)과 속성 (Properties)을 정의합니다. 이 예제에서는 Amazon Machine Image (AMI) ID와 인스턴스 유형을 지정하였습니다.

A3에서는 파라미터를 사용하여 코드를 더욱 유연하게 작성할 수 있습니다. 다음은 파라미터를 사용한 예제입니다.


Parameters:
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t2.medium

Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0c55b159cbfafe1f0
      InstanceType: !Ref InstanceType

이 예제에서는 Parameters 섹션을 추가하여 InstanceType 파라미터를 정의하였습니다. 파라미터의 기본값과 허용되는 값을 지정할 수 있습니다. 리소스 속성에서는 !Ref 함수를 사용하여 파라미터를 참조합니다.

A3에서는 함수를 사용하여 값을 동적으로 할당할 수 있습니다. 다음은 !Join 함수를 사용한 예제입니다.


Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Join ['-', [my-bucket, !Ref AWS::Region]]

이 예제에서는 S3 버킷을 생성하며, 버킷 이름을 !Join 함수를 사용하여 동적으로 생성합니다. my-bucket과 현재 AWS 리전 (!Ref AWS::Region)을 '-'로 연결하여 버킷 이름을 생성합니다. 예를 들어, 리전이 us-west-2인 경우 생성되는 버킷 이름은 my-bucket-us-west-2가 됩니다.

이렇게 A3의 기본 구조와 문법에 대해 알아보았습니다. 다음 섹션에서는 A3를 사용하여 실제 AWS 리소스를 생성하고 관리하는 방법에 대해 자세히 다루겠습니다.

심화 개념 및 테크닉

AWS A3(Amazon Athena Auto Assist)는 SQL 쿼리를 자동으로 생성하고 최적화해주는 강력한 도구입니다. 이번 섹션에서는 AWS A3의 고급 사용법과 패턴에 대해 알아보겠습니다.

먼저, AWS A3를 사용하여 복잡한 조인(JOIN) 쿼리를 자동으로 생성하는 방법을 살펴보겠습니다.


from pyathena import connect

conn = connect(s3_staging_dir='s3://YOUR_S3_BUCKET/path/to/query/results/')
cursor = conn.cursor()

query = '''
GENERATE_SQL_WITH_AUTO_ASSIST
SELECT c.customer_id, c.name, o.order_id, o.total_amount 
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_date BETWEEN '2022-01-01' AND '2022-12-31'
'''

cursor.execute(query)
results = cursor.fetchall()

for row in results:
    print(row)

위 코드에서는 GENERATE_SQL_WITH_AUTO_ASSIST 키워드를 사용하여 AWS A3에게 복잡한 조인 쿼리를 자동으로 생성하도록 요청합니다. AWS A3는 customers와 orders 테이블을 조인하고, 2022년에 발생한 주문 정보를 검색하는 최적화된 SQL 쿼리를 생성합니다.

다음으로, AWS A3를 활용하여 데이터 분석을 위한 집계 쿼리를 자동으로 생성하는 방법을 알아보겠습니다.


query = '''
GENERATE_SQL_WITH_AUTO_ASSIST
SELECT p.product_category, SUM(oi.quantity) AS total_quantity, SUM(oi.price * oi.quantity) AS total_sales
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
GROUP BY p.product_category
ORDER BY total_sales DESC
'''

cursor.execute(query)
results = cursor.fetchall()

for row in results:
    print(f"Category: {row[0]}, Total Quantity: {row[1]}, Total Sales: {row[2]}")

위 코드는 AWS A3를 사용하여 상품 카테고리별 판매량과 매출을 계산하는 집계 쿼리를 자동으로 생성합니다. order_items와 products 테이블을 조인하고, 상품 카테고리로 그룹화하여 각 카테고리의 총 판매량과 매출을 계산한 후 매출 내림차순으로 정렬합니다.

마지막으로, AWS A3를 사용하여 윈도우 함수(Window Function)를 포함한 고급 분석 쿼리를 자동으로 생성하는 방법을 살펴보겠습니다.


query = '''
GENERATE_SQL_WITH_AUTO_ASSIST
SELECT 
    e.employee_id,
    e.department,
    e.salary,
    AVG(e.salary) OVER (PARTITION BY e.department) AS avg_department_salary,
    RANK() OVER (ORDER BY e.salary DESC) AS salary_rank
FROM employees e
'''

cursor.execute(query)
results = cursor.fetchall()

for row in results:
    print(f"Employee ID: {row[0]}, Department: {row[1]}, Salary: {row[2]}, Avg Department Salary: {row[3]}, Salary Rank: {row[4]}")

위 코드에서는 AWS A3를 활용하여 윈도우 함수를 포함한 고급 분석 쿼리를 자동으로 생성합니다. employees 테이블에서 각 직원의 급여, 부서별 평균 급여, 그리고 전체 직원 중 급여 순위를 계산합니다. AWS A3는 PARTITION BY와 ORDER BY 절을 사용하여 최적화된 윈도우 함수 쿼리를 생성합니다.

이상으로 AWS A3의 고급 사용법과 패턴에 대해 알아보았습니다. AWS A3를 활용하면 복잡한 SQL 쿼리를 손쉽게 생성하고 최적화할 수 있어 데이터 분석 작업의 효율성을 높일 수 있습니다. 다음 섹션에서는 AWS A3와 다른 AWS 서비스와의 연동 방법에 대해 살펴보겠습니다.

실전 예제

그럼 이제 AWS A3을 활용한 실전 예제를 단계별로 살펴보겠습니다.

첫 번째 예제는 AWS A3을 사용하여 간단한 이미지 분류 모델을 학습시키는 코드입니다:


from a3.api import A3
from a3.datasets import CIFAR10

# A3 초기화
a3 = A3()

# 데이터셋 로드
train_data, test_data = CIFAR10()

# 모델 정의 
model = a3.image_classification("resnet18", num_classes=10)

# 모델 학습
model.fit(train_data, epochs=10, batch_size=128)

# 모델 평가
accuracy = model.evaluate(test_data)
print(f"Test Accuracy: {accuracy:.2f}")

위 코드에서는 A3 객체를 생성한 후, CIFAR10 데이터셋을 로드하고 ResNet18 아키텍처를 사용하여 이미지 분류 모델을 정의합니다. 그리고 fit() 메서드로 모델을 학습시키고, evaluate()로 테스트 데이터에 대한 정확도를 평가합니다.

두 번째 예제는 사전학습된 언어 모델을 사용하여 텍스트 분류를 수행하는 코드입니다:


from a3.api import A3
from a3.datasets import IMDB

a3 = A3()

# IMDB 데이터셋 로드
train_data, test_data = IMDB()

# 사전학습된 BERT 모델로 텍스트 분류기 생성
model = a3.text_classification("bert-base-cased", num_classes=2)

# 모델 파인튜닝
model.fit(train_data, epochs=3, batch_size=32)

# 모델 평가
accuracy = model.evaluate(test_data)
print(f"Test Accuracy: {accuracy:.2f}")

# 샘플 텍스트 분류
text = "This movie was amazing! I loved every minute of it."
prediction = model.predict(text)
print(f"Predicted sentiment: {prediction}")

여기서는 IMDB 영화 리뷰 데이터셋을 사용하여 사전학습된 BERT 모델로 텍스트 분류기를 생성합니다. 모델을 파인튜닝한 후 평가하고, predict() 메서드로 샘플 텍스트의 감성을 분류합니다.

마지막으로, AWS A3을 활용하여 객체 탐지 모델을 학습시키는 예제 코드입니다:


from a3.api import A3
from a3.datasets import COCO

a3 = A3()

# COCO 데이터셋 로드
train_data, test_data = COCO()

# 객체 탐지 모델 정의 (YOLOv5)
model = a3.object_detection("yolov5s", num_classes=80)

# 모델 학습
model.fit(train_data, epochs=30, batch_size=16)

# 모델 평가
metrics = model.evaluate(test_data)
print(f"Test mAP: {metrics['map']:.2f}")

# 샘플 이미지에 대한 객체 탐지
detections = model.predict("sample_image.jpg")
print(f"Detected objects: {detections}")

이 코드에서는 COCO 데이터셋과 YOLOv5 모델을 사용하여 객체 탐지 모델을 학습시킵니다. 모델을 평가한 후, predict() 메서드로 샘플 이미지 내의 객체를 탐지합니다.

이상의 예제들을 통해 AWS A3으로 다양한 기계 학습 태스크를 간편하게 구현할 수 있음을 확인했습니다. 다음 섹션에서는 AWS A3의 고급 기능과 활용 팁에 대해 알아보겠습니다.

성능 최적화 팁

이번 섹션에서는 AWS A3를 사용할 때 성능을 최적화하는 방법에 대해 알아보겠습니다. 코드 예제와 함께 자세히 살펴보도록 하겠습니다.

  1. 비동기 처리 활용하기:위 코드에서는 asyncio 모듈을 사용하여 비동기적으로 데이터를 가져옵니다. fetch_data 함수는 데이터를 가져오는 비동기 함수이고, asyncio.create_task를 사용하여 각 URL에 대한 비동기 태스크를 생성합니다. 그리고 asyncio.gather를 사용하여 모든 태스크의 결과를 한 번에 기다립니다. 이렇게 비동기 처리를 활용하면 동시에 여러 작업을 처리할 수 있어 성능이 향상됩니다.
  2. import asyncio async def fetch_data(url): # 데이터 가져오는 비동기 함수 # ... return data async def main(): urls = [...] # 가져올 URL 목록 tasks = [] for url in urls: task = asyncio.create_task(fetch_data(url)) tasks.append(task) results = await asyncio.gather(*tasks) # 결과 처리 # ... asyncio.run(main())
  3. 데이터베이스 연결 풀 사용하기:데이터베이스 연결 풀을 사용하면 매번 새로운 연결을 생성하는 대신 미리 생성된 연결을 재사용할 수 있습니다. 위 코드에서는 create_engine 함수에 pool_sizemax_overflow 매개변수를 전달하여 연결 풀의 크기를 설정합니다. 이렇게 하면 데이터베이스 연결 오버헤드를 줄일 수 있어 성능이 향상됩니다.
  4. from sqlalchemy import create_engine db_url = "postgresql://user:password@host/dbname" engine = create_engine(db_url, pool_size=10, max_overflow=20) # 데이터베이스 쿼리 실행 with engine.connect() as conn: result = conn.execute("SELECT * FROM users") # 결과 처리 # ...
  5. 캐싱 활용하기:캐싱을 활용하면 이전에 계산한 결과를 저장하여 중복 계산을 피할 수 있습니다. 위 코드에서는 @lru_cache 데코레이터를 사용하여 피보나치 수열 함수의 결과를 캐싱합니다. 처음 호출 시에는 계산이 수행되지만, 이후 동일한 입력으로 호출할 때는 캐시된 결과를 즉시 반환합니다. 이를 통해 불필요한 계산을 피하고 성능을 높일 수 있습니다.
  6. from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(100)) # 354224848179261915075 print(fibonacci(100)) # 354224848179261915075 (캐시된 결과 사용)

성능 최적화는 애플리케이션의 응답 시간을 단축하고 효율성을 높이는 데 중요한 역할을 합니다. 다음 섹션에서는 AWS A3의 보안 강화 방법에 대해 알아보도록 하겠습니다.

일반적인 오류와 해결 방법

AWS A3를 사용하면서 자주 마주칠 수 있는 오류들과 그 해결 방법에 대해 알아보겠습니다. 코드 예제를 통해 오류 상황을 재현하고, 해결 방안을 제시하겠습니다.

먼저, 인증 오류입니다. AWS A3 클라이언트를 초기화할 때 잘못된 액세스 키나 시크릿 키를 사용하면 인증 오류가 발생합니다.


from a3 import A3Client

# 잘못된 액세스 키와 시크릿 키 사용
client = A3Client(access_key='wrong_access_key', secret_key='wrong_secret_key')

# 오류 발생: A3AuthenticationError

위 코드에서는 잘못된 액세스 키와 시크릿 키를 사용하여 A3Client를 초기화하므로, A3AuthenticationError가 발생합니다. 이를 해결하려면 올바른 액세스 키와 시크릿 키를 사용해야 합니다.

다음으로, 리소스 없음 오류입니다. 존재하지 않는 버킷이나 객체에 접근하려고 하면 이 오류가 발생합니다.


from a3 import A3Client

client = A3Client()

# 존재하지 않는 버킷에 접근
client.get_bucket('nonexistent-bucket')

# 오류 발생: A3ResourceNotFoundError

위 코드에서는 존재하지 않는 버킷 'nonexistent-bucket'에 접근하려고 하므로, A3ResourceNotFoundError가 발생합니다. 이를 해결하려면 실제로 존재하는 버킷 이름을 사용해야 합니다.

마지막으로, 권한 오류입니다. 필요한 권한이 없는 작업을 수행하려고 하면 이 오류가 발생합니다.


from a3 import A3Client

client = A3Client()

# 쓰기 권한이 없는 버킷에 객체 업로드 시도
client.upload_file('example.txt', 'read-only-bucket', 'example.txt')

# 오류 발생: A3AccessDeniedError

위 코드에서는 쓰기 권한이 없는 버킷 'read-only-bucket'에 객체를 업로드하려고 하므로, A3AccessDeniedError가 발생합니다. 이를 해결하려면 해당 작업을 수행할 수 있는 적절한 권한을 가진 IAM 사용자나 역할을 사용해야 합니다.

이처럼 AWS A3를 사용할 때 발생할 수 있는 몇 가지 일반적인 오류와 그 해결 방법에 대해 알아보았습니다. 이제 AWS A3의 고급 기능과 활용 방법에 대해 살펴보겠습니다.

최신 트렌드와 미래 전망

AWS A3와 관련하여 최신 개발 동향과 도구들에 대해 살펴보겠습니다. 먼저 AWS CDK(Cloud Development Kit)를 활용하여 A3 아키텍처를 정의하고 배포하는 방법을 알아보겠습니다.


from aws_cdk import (
    aws_lambda as lambda_,
    aws_apigateway as apigw,
    core
)

class ServerlessAPI(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        handler = lambda_.Function(self, "APIHandler",
            runtime=lambda_.Runtime.PYTHON_3_8,
            code=lambda_.Code.from_asset("lambda"),
            handler="api.handler",
        )

        api = apigw.LambdaRestApi(self, "API",
            handler=handler,
            proxy=False
        )

        items = api.root.add_resource("items")
        items.add_method("GET")
        items.add_method("POST")

위의 코드는 AWS CDK를 사용하여 서버리스 API를 정의하는 예제입니다. Lambda 함수와 API Gateway를 생성하고 연결하는 과정을 간단하게 표현할 수 있습니다. 이를 통해 A3 아키텍처의 핵심 컴포넌트를 쉽게 구성할 수 있습니다.

다음으로 AWS Step Functions를 활용하여 A3 아키텍처의 워크플로우를 구성하는 방법을 살펴보겠습니다.


import boto3

sfn = boto3.client('stepfunctions')

definition = {
    "Comment": "A3 Workflow",
    "StartAt": "ProcessData",
    "States": {
        "ProcessData": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ProcessDataFunction",
            "Next": "AnalyzeData"
        },
        "AnalyzeData": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:AnalyzeDataFunction",
            "Next": "VisualizeData"
        },
        "VisualizeData": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:VisualizeDataFunction",
            "End": True
        }
    }
}

response = sfn.create_state_machine(
    name='A3Workflow',
    definition=json.dumps(definition),
    roleArn='arn:aws:iam::123456789012:role/StepFunctionsRole'
)

print(response)

위의 코드는 AWS Step Functions를 사용하여 A3 워크플로우를 정의하는 예제입니다. 데이터 처리, 분석, 시각화 단계를 각각의 Lambda 함수로 정의하고, Step Functions를 통해 순차적으로 실행되도록 구성합니다. 이를 통해 A3 아키텍처의 데이터 처리 흐름을 관리할 수 있습니다.

마지막으로 AWS Amplify를 활용하여 A3 아키텍처 기반의 웹 애플리케이션을 개발하는 방법을 살펴보겠습니다.


import { API } from 'aws-amplify';

async function fetchData() {
  try {
    const response = await API.get('a3api', '/items');
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

async function createData() {
  try {
    const data = {
      name: 'New Item',
      description: 'This is a new item'
    };
    const response = await API.post('a3api', '/items', { body: data });
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

위의 코드는 AWS Amplify를 사용하여 A3 아키텍처의 API와 상호작용하는 예제입니다. Amplify의 API 모듈을 통해 간편하게 API 호출을 수행할 수 있으며, 이를 통해 웹 애플리케이션에서 A3 아키텍처의 기능을 활용할 수 있습니다.

이러한 최신 개발 도구들을 활용함으로써 A3 아키텍처의 구현과 관리가 보다 간편해지고 있습니다. 향후에는 A3 아키텍처와 관련된 더욱 다양한 서비스와 도구들이 등장할 것으로 예상되며, 이를 통해 보다 효율적이고 확장성 있는 애플리케이션 개발이 가능해질 것입니다.

다음 섹션에서는 AWS A3 아키텍처를 활용한 실제 사례와 베스트 프랙티스에 대해 알아보도록 하겠습니다.

결론 및 추가 학습 자료

지금까지 AWS A3에 대해 살펴보았습니다. 주요 내용을 요약하면 다음과 같습니다:

  • AWS A3는 Amazon Athena를 활용한 데이터 분석 및 처리 서비스입니다.
  • S3에 저장된 데이터를 SQL 쿼리를 통해 손쉽게 분석할 수 있습니다.
  • Glue Data Catalog를 통해 데이터 스키마를 관리하고 Athena에서 참조할 수 있습니다.

다음은 Athena를 사용하여 S3 데이터를 쿼리하는 예제 코드입니다:


import boto3

athena = boto3.client('athena')

query = 'SELECT * FROM "mydatabase"."mytable" limit 10;'
    
response = athena.start_query_execution(
    QueryString=query,
    QueryExecutionContext={
        'Database': 'mydatabase'
    },
    ResultConfiguration={
        'OutputLocation': 's3://mybucket/output/'
    }
)

query_execution_id = response['QueryExecutionId']
print(f"Query submitted. Execution ID: {query_execution_id}")

위 코드는 Athena 클라이언트를 생성하고, SQL 쿼리를 실행하여 쿼리 실행 ID를 반환받습니다. 쿼리 결과는 지정된 S3 경로에 저장됩니다.

Glue Data Catalog에 새로운 데이터베이스와 테이블을 생성하는 예제는 다음과 같습니다:


import boto3

glue = boto3.client('glue')

# 데이터베이스 생성
response = glue.create_database(
    DatabaseInput={
        'Name': 'mydatabase',
        'Description': 'My Glue database'
    }
)

print(f"Database created. Response: {response}")

# 테이블 생성 
response = glue.create_table(
    DatabaseName='mydatabase',
    TableInput={
        'Name': 'mytable',
        'StorageDescriptor': {
            'Columns': [
                {
                    'Name': 'col1', 
                    'Type': 'string'
                },
                {
                    'Name': 'col2',
                    'Type': 'int'
                }
            ],
            'Location': 's3://mybucket/mydata/',
            'InputFormat': 'org.apache.hadoop.mapred.TextInputFormat',
            'OutputFormat': 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat',
            'SerdeInfo': {
                'SerializationLibrary': 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe',
                'Parameters': {
                    'field.delim': ','
                }
            }
        },
        'Parameters': {
            'classification': 'csv'
        }
    }
)

print(f"Table created. Response: {response}")

위 코드는 Glue 클라이언트를 사용하여 mydatabase라는 데이터베이스를 생성하고, mytable이라는 테이블을 생성합니다. 테이블은 CSV 포맷의 데이터를 나타내며, S3의 지정된 경로에 저장되어 있습니다.

Athena에서 쿼리 실행 결과를 가져오는 예제는 다음과 같습니다:


import boto3
import time

athena = boto3.client('athena')

query_execution_id = 'your_query_execution_id'

# 쿼리 실행이 완료될 때까지 대기
while True:
    response = athena.get_query_execution(QueryExecutionId=query_execution_id)
    state = response['QueryExecution']['Status']['State']
    if state == 'SUCCEEDED':
        break
    elif state == 'FAILED' or state == 'CANCELLED':
        raise Exception(f"Query failed or cancelled. Reason: {response['QueryExecution']['Status']['StateChangeReason']}")
    else:
        print(f"Query still running. Current state: {state}")
        time.sleep(5)  # 5초 간격으로 상태 확인

# 쿼리 결과 가져오기
response = athena.get_query_results(QueryExecutionId=query_execution_id)
print(f"Query results:")
for row in response['ResultSet']['Rows']:
    print(row['Data'])

위 코드는 쿼리 실행 ID를 사용하여 쿼리 실행 상태를 확인하고, 완료될 때까지 대기합니다. 쿼리가 성공적으로 완료되면 get_query_results 메서드를 호출하여 결과를 가져와 출력합니다.

추가적으로 학습할 만한 자료는 다음과 같습니다:

이상으로 AWS A3에 대해 알아보았습니다. 다음 섹션에서는 AWS의 또 다른 강력한 데이터 분석 서비스인 Amazon QuickSight에 대해 자세히 살펴보도록 하겠습니다.



728x90

'IT > AWS, DB' 카테고리의 다른 글

[MariaDB 초기 설정]  (0) 2024.08.26
[MariaDB 설치 방법]  (1) 2024.08.26
[AWS RDS] AWS Database  (1) 2024.08.26