AWS/Serverless Lambda

[AWS Lambda] Chalice 이미지 리사이징 서비스 개발

yubi5050 2024. 12. 25. 18:16

이미지 리사이징 서비스 설명

서비스 소개 및 설명은 아래에 나와있다. 

https://yubi5050.tistory.com/332

 

파일 관리 서비스 3 - S3 이미지 리사이징 서비스 만들기 (by. CloudFront, Lambda@Edge)

개요웹 페이지 서비스에서 스토리지(S3)에 가지고, 사용하고 잇는 원본 이미지 크기가  720 x 360 라고 가정하자하지만 페이지에 따라 640x360, 1200x600 등등 출력할 화면이 있다고 가정할 때.. (추후 2:

yubi5050.tistory.com

 

구현 순서 (1~2) 

1. S3 이미지 만들고 & S3 캐싱하는 CloudFront 만들기

2. Lambda (chalice) 코드 작성

- chalice의 lambda function 사용하여 구현

- edge 환경으로 ‘배포’를 하는 것을 Lambda@Edge 라고 한다.

- 코드는 cloudfront 이벤트 trigger 객체(payload) 받아서 파싱 + 리사이징 처리 + CloudFront 배포 등)

 

구현 순서 (3) Lambda (chalice) .config 셋팅

기본

- chalice는 IAM Roles(역할)을 자동으로 생성 해줌

- chalice config 링크 를 잘 읽고 config를 작성해야 한다!

 

chalice .config 과 IAM

- .config 에서 IAM 역할, 권한 비활성화  -> IAM에서 직접 관리 하기 위해

  - IAM의 역할, 권한은 .config 로 생성 가능

  - IAM의 신뢰 관계는 .config 로 생성 불가능

- chalice에서 IAM의 온전히 관리할 수 없기에, 직접 관리 하는 것

 

다음과 같이 chaclie에 셋팅(작성)

- IAM의 역할, 권한 자동으로 셋팅 안되게

- manage_iam_role : false

- 위 key false 조건에 따라 -> iam_role_arn 커스텀 iam arn 주소 입력 가능 (IAM 설정은 다음 4.에서)

{
  "version": "2.0",
  "app_name": "file-resizing",
  "stages": {
    "live": {
      "lambda_functions": {
        "test": {}
      },
      "manage_iam_role": false, // false 처리 되야 iam_role_arn 지정 가능 
      "iam_role_arn": "arn:aws:iam::<your arm 주소>:role/lambda-resizing-image",
      "lambda_timeout": 30
    }
  }
}

 

구현 순서 (4-1) IAM 수동 설정 - 권한

- iam 역할 수동 생성

- iam 역할 - 권한을 다음과 같이 생성한다.

aws iam 권한(정책) 설정

 

policy.json 파일 (aws iam 역할 - 권한)

// 배포 간 사용되는 파일 아님 -  IAM 역할의 권한 (람다에서 해당 IAM 역할을 사용함)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
            // lambda 컨트롤 권한
                "lambda:InvokeFunction",
                "lambda:GetFunction",
            // 로그 권한
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
            // cloudfront 권한
                "cloudfront:UpdateDistribution",
                "cloudfront:CreateInvalidation"
            ],
            "Resource": "*"
        }
    ]
}

 

구현 순서 (4-2) IAM 수동 설정 - 신뢰 관계

- iam 역할의 신뢰 관계 추가

 

- trust_policy.json 파일 (aws iam 역할 - 권한)

// 배포 간 사용되는 파일 아님 -  IAM 역할의 신뢰 관계
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com",
                    // edge 환경 추가
                    "edgelambda.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

 

구현 순서 (5) 배포된 CloudFront 객체에서 캐싱 정책 설정

- 배포된 CloudFront 객체 접근

- '동작' 탭에서 query_parameter 설정 : width, height 등

 

구현 순서 (6) 배포된 CloudFront 객체에서 캐싱 정책 설정

  1. Lambda → Lambda@Edge 로 배포
  2. Lambda 설정 접속 
  3. Lambda를 Lambda@Edge로 배포

 

 

최종 기능 및 응답/에러 정리

리사이징 성공인 경우

- ?width=500&height=300

- 상태코드 200, resizing 된 이미지 객체

 

리사이징 실패로 처리하는 경우

- 파라미터 부족 : ?width=500 (height 없음)

- 파라미터 값이 파일보다 더 크거나 0 : ?width=99999&height=99999

- 파라미터 자료형 유효 x : ?width=asdf&hegith=300

- 오리진 응답 상태값 200 아님

- 반환 결과 그대로 ~ (상태코드 200, 원본(오리진) 응답 객체)

- width 만 받고, 알아서 비율 조정

 

기타 참고 문서