IT/Infra&Cloud

[aws] Developing on AWS

Hayley Shim 2023. 10. 29. 00:56

안녕하세요. Developing on AWS 실습 내용을 진행하며 aws 내 cli, sdk, api 사용 관련 주요 내용을 정리한 글입니다.

개발 환경 구성

# IDE 설치 확인
$ python --version# AWS CLI 설치 확인
$ aws --version$ aws configure
$ aws sts get-caller-identity# IAM 권한 확인
$ aws s3 ls$ bucketToDelete=$(aws s3api list-buckets --output text --query 'Buckets[?contains(Name, `deletemebucket`) == `true`] | [0].Name')# s3 삭제 시도
$ aws s3 remove-bucket s3://$bucketToDelete# 예상 출력******************************
**** This is OUTPUT ONLY. ****
******************************remove_bucket failed: s3://6nzxc1sjkmar-lab1deletemebucket-t63kd50lk000 An error occurred (AccessDenied) when calling the DeleteBucket operation: Access Denied# --debug 옵션 사용$ aws s3 rb s3://$bucketToDelete --debug# 디버그를 통해 인스턴스 메타데이터 검색하여 인증 프로세스 시작
# v4 auth를 사용하여 서명 확인 후 Amazon s3 요청 준비하고 응답헤더, 응답 본문을 생성하고 버킷 목록을 반환
# Amazon s3 엔드포인트에 연결. 403오류 Access Denied 발생$******************************
**** This is OUTPUT ONLY. ****
******************************2022-03-24 19:19:39,894 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): 6nzxc1sjkmar-lab1deletemebucket-t63kd50lk000.s3.ap-northeast-1.amazonaws.com:443
2022-03-24 19:19:39,981 - MainThread - urllib3.connectionpool - DEBUG - https://6nzxc1sjkmar-lab1deletemebucket-t63kd50lk000.s3.ap-northeast-1.amazonaws.com:443 "DELETE / HTTP/1.1" 403 None
2022-03-24 19:19:39,982 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amz-request-id': '7XBWQ3W8JM3KRY1W', 'x-amz-id-2': 'HcRkKJkSag//iCDC+ap7N/FaWWYNPhAsOdTE24I6pFYPdn+sZ7qtv1mzy4ZcKID++GCjomil6ks=', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Date': 'Thu, 24 Mar 2022 19:19:39 GMT', 'Server': 'AmazonS3'}
2022-03-24 19:19:39,982 - MainThread - botocore.parsers - DEBUG - Response body:
b'<?xml version="1.0" encoding="UTF-8"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>7XBWQ3W8JM3KRY1W</RequestId><HostId>HcRkKJkSag//iCDC+ap7N/FaWWYNPhAsOdTE24I6pFYPdn+sZ7qtv1mzy4ZcKID++GCjomil6ks=</HostId></Error>'remove_bucket failed: s3://6nzxc1sjkmar-lab1deletemebucket-t63kd50lk000 An error occurred (AccessDenied) when calling the DeleteBucket operation: Access Denied# notes-application-role에 s3:DeleteBucket IAM 권한이 위임되지 않아 실패# 고객 관리형 IAM 정책 검토
$ policyArn=$(aws iam list-policies --output text --query 'Policies[?PolicyName == `S3-Delete-Bucket-Policy`].Arn')$ aws iam get-policy-version --policy-arn $policyArn --version-id v1******************************
**** This is OUTPUT ONLY. ****
******************************PolicyVersion:
  CreateDate: '2022-03-24T17:58:58+00:00'
  Document:
    Statement:
    - Action:
      - s3:DeleteBucket
      Effect: Allow
      Resource: arn:aws:s3:::6nzxc1sjkmar-lab1deletemebucket-t63kd50lk000
    Version: '2012-10-17'
  IsDefaultVersion: true
  VersionId: v1# IAM 정책을 NOTES-APPLICATION-ROLE에 연결
$ aws iam attach-role-policy --policy-arn $policyArn --role-name notes-application-role# 역할에 연결된 정책 검토
$ aws iam list-attached-role-policies --role-name notes-application-role******************************
**** This is OUTPUT ONLY. ****
******************************AttachedPolicies:
- PolicyArn: arn:aws:iam::710606863198:policy/S3-Delete-Bucket-Policy
  PolicyName: S3-Delete-Bucket-Policy
- PolicyArn: arn:aws:iam::aws:policy/ReadOnlyAccess
  PolicyName: ReadOnlyAccess
- PolicyArn: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
  PolicyName: AmazonSSMManagedInstanceCore# 버킷 삭제 명령을 실행하여 버킷 삭제 확인
$ aws s3 rb s3://$bucketToDelete******************************
**** This is OUTPUT ONLY. ****
******************************remove_bucket: 6nzxc1sjkmar-lab1deletemebucket-t63kd50lk000$ aws s3 ls******************************
**** This is OUTPUT ONLY. ****
******************************2022-03-24 17:58:34 6nzxc1sjkmarkw5g4ugi-lab1bucket-1g9fvp2ico63h

Amazon S3

 
 

ETag 헤더 : 멀티 파트 업로드 시 중요!!!

  • 헤더에 지정된 메타데이터를 검토해야하는 경우가 있습니다. 예를들어 파일 및 객체 비교를 위해 응답의 ETag 헤더를 사용할 수 있습니다. 객체는 S3 버킷에 업로드되면 ETag를 받습니다. 이 ETag는 MD5 알고리즘을 사용하여 계산된 체크섬입니다. 업로드가 멀티파트인 경우 ETag에는 정보의 일부가 포함됩니다.

s3 python API

head_bucket(**kwargs)

멀티파트 업로드

미리 서명된 URL 생성

** pre-signed url 생성
$ aws s3 presign s3://us-stocks/contacts.json --expires-in 60** presigned-py
import boto3
 url = boto3.client('s3').generate_presigned_url(
 ClientMethod='get_object',
 Params={'Bucket': 'us-stocks', 'Key': 'contacts.json'},
 ExpiresIn=60)
 print(url)

Python 페이징

import boto3
from botocore.exceptions import ClientError

def paginate_through_all_objects_s3_bucket(bucket_name, max_items=None:int,page_size=None:int, starting_token=None:string):
   session = boto3.session.Session()
   s3_client = session.client('s3')
   try:
   paginator = s3_client.get_paginator('list_objects')
      response = paginator.paginate(Bucket=bucket_name, PaginationConfig={
         'MaxItems':max_items,
         'PageSize':page_size,
         'StartingToken':starting_token}
      )
   return response
   except ClientError as e:
      raise Exception("boto3 client error in paginate_through_all_objects_s3_bucket: " + e.__str__())
   except Exception as e:
      raise Exception("Unexpected error in paginate_through_all_objects_s3_bucket: " + e.__str__())

#1st Run
a = paginate_through_all_objects_s3_bucket('s3-test-bucket',2,5)
print(*a)
#2nd Run
for items in a:
next_token = items['Contents'][max_items-1]['Key']
b = paginate_through_all_objects_s3_bucket('s3-test-bucket',2,5,next_token)
print(*b)

s3 배치 작업

정적 웹사이트 호스팅

CORS : 한 도메인에서 로드되어 다른 도메인에 있는 리소스와 상호작용하는 클라이언트 웹 애플리케이션에 대한 방법 정의

CORS 설정

https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html

Amazon DynamoDB

  1. DynamoDB 테이블 생성
  2. 테이블에 데이터 로드
  3. 파티션 키 및 프로젝션을 사용하여 데이터 쿼리
  4. Paginator를 사용하여 테이블 스캔
  5. 테이블 항목 업데이트
  6. DynamoDB용 PartiQL사용

AWS Lambda

Amazon API Gateway

  • 스토리지, DB, 벡엔드가 설정된 후 AWS Lambda 함수에 엑세스할 수 있는 방법이 필요합니다.
  • API gateway 리소스를 생성한 후, lambda 함수에서 반환된 응답을 변환합니다. CORS헤더를 구성합니다.
  1. REST API 및 리소스 생성
  2. GET 메서드 구성 및 응답 변환을 위한 매핑 템플릿 추가
  3. POST 메서드 구성 및 요청 검증 모델 추가
  4. CORS 구성으로 API 배포

App Mordenization

AWS X-Ray

 

 

 

blog migration project

written in 2022.10.12

https://medium.com/techblog-hayleyshim/aws-devloping-on-aws-394239df3da0