본문 바로가기
프로그래밍/유니티

클라이언트 데이터 JSON 파싱 - 3

by Programmer.Junny 2024. 12. 7.

이번 포스팅은 AWS Lambda와 IAM 정책 설정에 대해 작성하고자 한다.
저번 포스팅에서 말했듯 AWS Lambda를 통해 IAM 에서 자격증명을 발급받는 코드를 실행시킬 수 있다.
좀 더 자세한 정의는 아래와 같다.

AWS Lambda란?

AWS Lambda를 사용하면 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있습니다.
Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다. Lambda를 사용하면 Lambda가 지원하는 언어 런타임 중 하나로 코드를 제공하기만 하면 됩니다.

AWS Lambda 서비스로 이동


AWS에 접속하여 검색창에 Lambda를 찾고 Lambda 서비스로 이동한다.

함수 생성

함수 생성에서 '새로 작성', '함수 이름'을 작성한다.

아래 조금 내리면 원하는 언어를 선택하여 Lambda를 작성하도록 하는데, 우리는 Python을 사용할 것이므로 Python3.9를 선택한다.

아키텍쳐는 위와 같이 설정한다.

함수코드 작성

import json
import boto3
import os

def lambda_handler(event, context):
    # 이벤트에서 파라미터 추출
    bucket_name = event['queryStringParameters']['bucket_name']
    object_name = event['queryStringParameters']['object_name']
    expiration = int(event['queryStringParameters'].get('expiration', 3600))
    
    # S3 클라이언트 생성
    s3_client = boto3.client('s3')
    
    # 사전 서명된 URL 생성
    try:
        response = s3_client.generate_presigned_url('get_object',Params=
        {
        	'Bucket': bucket_name,
            'Key': object_name},
            ExpiresIn=expiration)
        return {
            'statusCode': 200,
            'body': json.dumps({'url': response})
        }
    except Exception as e:
        return {
            'statusCode': 500,
            'body': json.dumps({'error': str(e)})
        }

코드를 간략히 설명하자면 AWS API Gateway에서 요청하면 lambda_handler 함수를 통해 사전 서명된 URL을 반환하는 코드이다.
위 코드를 작성 후 좌측 'Deploy'를 눌러 배포한다.

IAM 정책 권한 설정

IAM 정책 권한을 설정하지 않으면 위의 함수 코드의 에러가 발생한다. 이유는 AWS S3에 대한 정책 권한이 없기 때문이다.

이를 위해 IAM 정책 권한을 설정한다.

Lambda에서 코드 작성하는 부분의 상단을 보면 위와 같은 목록이 있다. 여기서 '구성'을 선택한다.

왼쪽 탭에서 '권한' 탭을 선택한다.

 

그러면 보이는 역할에 자동적으로 생성된 IAM 권한이 보일 것이다. 이걸 클릭하여 IAM으로 이동한다.

오른쪽의 '권한 추가' 부분에 '인라인 정책 생성'을 선택한다.

우리는 S3에서 JSON 데이터를 가지고 올 것이므로 서비스를 'S3'를 선택한다.

액세스 수준은 선택된 작업을 제외하곤 액세스 하지 않는다는 뜻이다. 'GetObject'는 우리가 S3에서 JSON 데이터를 가져오기 때문에 체크하도록 한다.

밑으로 내려가서 bucket의 ARN을 추가할 수 있다. ARN이란 특별한건 아니고 Amazon Resource Name의 준말이다. 즉, 그냥 선택된 리소스가 무엇이냐. 라는 뜻이다.
우리가 접근하고자 하는 버킷이름을 입력하자.

마찬가지로 object도 입력하도록 한다. 우리가 설정한 버킷을 입력하고, Resource object name에 *를 추가한다면 해당 버킷에 있는 모든 객체(JSON)을 접근하여 가져올 수 있도록 한다는 뜻이다.

마지막으로 정책 이름을 추가하고 '정책 생성'을 한다.

완료되면 위 사진과 같이 추가된 '고객 인라인' 정책이 보이게 된다.

다시 Lambda로 돌아와 Deploy를 진행한다.

테스트 진행

배포 후 'Test' 버튼을 눌러 새로운 테스트를 생성한다.

{
  "queryStringParameters": {
    "bucket_name": "버킷이름",
    "object_name": "받아올 객체 경로",
    "expiration": "3600"
  }
}

테스트는 해당 동작이 잘 진행되는지를 알아볼 수 있는 디버깅모드라고 생각하면 편하다.
위의 JSON 코드를 작성한다.

테스트 상단에 'Save' 후 'Invoke'버튼을 누른다.

정상적으로 작동이 된다면, 아래와 같이 'OUTPUT' 콘솔 중 'statusCode' 가 200이 뜨고, 'body'에 URL 주소가 반환될 것이다.

이 URL 주소를 웹사이트로 접속하게 된다면 위 사진과 같이 Lambda가 실행되어, S3에 있는 JSON을 가져올 것이다.
만약 정상적으로 표시되지 않는다면 다시 위의 방법들을 살펴본 후 진행하면 된다.

최근댓글

최근글

skin by © 2024 ttuttak