이전 게시물
트러블슈팅
Provisioning Concurrency, Auto Scailing
Auto Scaling ARN 이슈
- 문제
${AWS::AccountId}
와 같은 CloudFormation 템플릿 문법을 사용했을 때, 적절한 AWS 데이터가 들어가지 않아 발생한 이슈.
- 해결
${}
문법을 사용하지 않고, 명시적으로 값을 입력하여 문제 해결.
CloudFormantion Alias, Version Template 관련 이슈
- 문제
- Provisioned Concurrency 설정 시, Alias 및 Version 관련 에러가 발생하는 경우가 많음.
- 원인
ResourceId: !Sub function:${FunctionName}:{Alias}
로 이루어지는 문법에서, Alias가 늦게 생성되거나, 초기화되지 않은 상태로 배포되면 에러가 발생한다.
- 해결
- 먼저 별칭(Alias)을 생성하는 템플릿을 사용하여 먼저 별칭을 붙여 배포를 진행
- 그 후 Auto Scaling 템플릿을 추가하여 별칭이 정상적으로 설정된 상태에서 Auto Scaling 설정을 배포하여 문제를 해결.
Policy
IAM ROLE, POLICY 템플릿 추가로 인한 이슈
- 문제
- SAM을 통해 람다를 배포할 때 기본적으로 생성되는 람다 정책이 있습니다. 하지만, SAM 템플릿에 새로운 정책과 역할을 만드는 템플릿을 선언하게 될 경우, 기본적으로 생성되었던 람다 정책이 생성되지 않습니다.
- 자바의 기본 생성자를 떠올리면 이해하기 쉽습니다. 클래스 생성자를 명시하여 만들어 주기 전에는 기본 생성자가 존재하지만, 생성자를 만드는 순간 기본 생성자가 사라지는 것과 동일한 현상입니다.
- SAM을 통해 람다를 배포할 때 기본적으로 생성되는 람다 정책이 있습니다. 하지만, SAM 템플릿에 새로운 정책과 역할을 만드는 템플릿을 선언하게 될 경우, 기본적으로 생성되었던 람다 정책이 생성되지 않습니다.
- 해결
- Role 및 Policy 추가 시, Role과 Policy를 선언하기 전 자동적으로 생성되던 Role과 Policy를 명시적으로 새롭게 만들 Role, Policy에 추가 기입하고 함께 설정하여 배포해야 함.
- 개인적인 의견을 덧붙이자면, 필요한 모든 정책을 미리 AWS에서 생성한 후 Function 템플릿에 해당 정책의 ARN을 넣어주는 것을 권장합니다.
정책 누락으로 인한 서버 이슈
- 문제
- AWS DynamoDB와 S3에 대한 접근 권한 설정 누락으로 인해 접근 오류 발생.
- Access Denied 발생.
- AWS DynamoDB와 S3에 대한 접근 권한 설정 누락으로 인해 접근 오류 발생.
- 해결
- 필요한 접근 권한을 포함하도록 정책을 수정하여 문제 해결.
Template Architecture 설정
- 문제
- ARM64 아키텍처에서 Dockerfile을 사용해 Python 라이브러리를 설치하는 것이 불가능한 문제 발생.
- 해결
- SAM Template의 Archituecture를 ARM에서 x86_64 아키텍처로 전환
- 덧붙이는 말
- 해당 이슈는 많은 테스트를 거치지 않았습니다. ARM으로 설정하기 위해 빼앗기는 시간보다 빠르게 x86_64로 설정하여 업무를 마무리하는 것이 이익이라 생각하여 ARM에 대한 시도를 중단하고 빠르게 전환하였습니다.
Gateway
- 문제:
- Gateway 설정 누락으로 인해 CORS(Cross-Origin Resource Sharing) 오류 발생.
- 원인
- 배포 템플릿에서
PATCH
메서드에 대한 Gateway 설정이 누락됨.
- 배포 템플릿에서
- 아래와 같이
PATCH
메서드에 대한 Gateway 설정을 추가하여 문제 해결
Resources:
ChordpliApi:
Type: AWS::Serverless::Api
Properties:
ApiPatchEvent:
Type: Api
Properties:
Auth:
Authorizer: ProdAuth
Path: /{all+}
Method: PATCH
RestApiId:
Ref: ChordpliApi
배포 Teamplate에서 Patch
에 해당하는 Gateway 템플릿을 누락하여 발생
502 Gateway 이슈
- 문제
- AWS Lambda 사용 중, API 호출 시 상태코드는 200을 반환하였으나, HTTP Status는 502를 반환하는 문제 발생.
- 원인
- API의 Response 크기가 AWS Lambda의 최대 응답 크기인 6MB를 초과하여 8.8MB로 반환하며 발생한 이슈.
- 해결
- Response를 gzip으로 압축하여 크기를 8.8MB에서 1.1MB로 감소시켜 문제를 해결.
운영 환경 별 공통 템플릿 이슈
- 문제
- Stage와 Prod 환경을 하나의 파일로 관리할 때, ECR에 이미지가 업로드 되지 않는 이슈
template
내에default
,prod
,stage
로 구성하고, 운영 환경에 맞는 ECR 레포지토리 연동
- Stage와 Prod 환경을 하나의 파일로 관리할 때, ECR에 이미지가 업로드 되지 않는 이슈
- 해결
- Stage, Prod 환경별 템플릿을 따로 구성하여 배포 진행
- 원인 추측
- 같은 템플릿에 구성 되어 있는 함수의 모든 ECR 레포지토리를 연동하지 않을 경우 발생.
.toml
파일에 환경별로 구성하여 배포했지만, yml에 존재하는 함수들의 이미지가image_repositories
에 누락 되어 있는 경우 발생.
배포 결과 요약
비용
- 람다 총 비용 일일 약 2.6달러 발생.
- 기존 스크래퍼 람다 비용이 일일 약 1.3달러였으나, Lambda로 배포를 전환하면서 추가로 1.3달러의 비용이 발생.
- 기존 ECS 배포
- EC2 비용 일일 약 6.3달러 발생
- 휴일 기준 비용
- 기존 ECS배포의 경우 EC2 비용으로 휴일에도 약 4달러 발생.
- 람다 배포의 경우 스크래퍼를 제외한 모든 람다는 휴일에 작동하지 않음.
- 비용 절감 예상
- 기존 약 300달러에서 약 40달러대로 절감될 것으로 추정
- PDF Processor 감소로 인해 상당한 비용 절감이 이미 이루어져 있는 상태입니다.
- 이 비용은 스크래퍼를 제외한 람다 비용이며, 모든 EC2 인스턴스를 종료할 수 없어 EC2 비용이 일부 지속됩니다.
- 기존 약 300달러에서 약 40달러대로 절감될 것으로 추정
배포
- ECS 배포로 발생하던 소용시간 27분이 람다 배포로 전환되며 4분으로 배포 시간이 단축됩니다.
- 이슈 발생시 대응 속도가 훨씬 빨라질 것으로 예상됩니다.
관리 포인트
- AWS Lambda 레포지토리에서 관리하던 스크래퍼 작업 파일을 API-Server 레포지토리에서 함께 운영할 수 있게 됨.
- 관리 포인트가 크게 줄어들었으며, DB 연결 및 모델 참조 등 API 서버 데이터 기반 작업의 업무 효율성이 증가함.
부록:: Lambda 적용 환경에 대한 고려 사항
- 비용 증가
- Lambda는 요청 수와 실행 시간에 따라 과금되는 구조를 가지고 있습니다. 따라서 애플리케이션의 트래픽이 증가하거나 복잡한 작업으로 인해 실행 시간이 길어지는 경우, 전체적인 운영 비용이 예상보다 크게 증가할 수 있습니다.
- Lambda의 일일 비용이 40~50 달러를 초과할 것으로 예상된다면, ECS로 다시 전환하는 것을 검토해야 합니다.
- 성능 한계
- Lambda는 설계상 단일 요청에 대한 짧은 기간의 처리에 최적화되어 있습니다. 따라서 지속적이고 높은 수준의 트래픽을 지속해서 처리해야 하는 애플리케이션에서는 성능 저하나 지연 시간 증가와 같은 문제가 발생할 수 있습니다.
- ECS는 고정 리소스로 운영되기 때문에, 높은 트래픽을 안정적으로 처리할 수 있는 환경을 제공하므로, 지속적으로 높은 트래픽이 발생할 경우 ECS로 다시 전환하는 것을 고려해야 합니다.
후기
좋은 동료분들 덕에 기회를 얻어 해당 업무를 진행할 수 있었습니다.
동료분들은 이미 해당 방법을 통한 배포한 경험이 있었고, 다양한 이슈에 대해 대응해 본 적이 있으므로, 만약 그분들이 직접 진행했다면 나보다 더 빠르고 문제없이 작업을 마무리했을 거라 생각합니다.
그런데도 저에게 일을 맡겨주시고, 문제가 생기더라도 계속 기회를 주시며, 제가 이 업무를 진행하면서 발생한 여러 불편한 일들을 모두 맡아주심으로써 부담 없이 업무를 진행하고 마무리할 수 있었습니다.
이러한 서포트받은 만큼, 앞으로 같은 방식으로 동료분들께 더 많은 도움을 드릴 수 있도록 경험을 쌓아야겠다고 생각하게 되었습니다.
아무튼 큰 산 하나를 넘었습니다! 끗!
출처
AWS
AWS SAM
AWS Serverless Application Model (AWS SAM) 란 무엇입니까? - AWS Serverless Application Model
Template :: Serverless API
AWS::Serverless::Api - AWS Serverless Application Model
Template :: Serverless Function
AWS::Serverless::Function - AWS Serverless Application Model
NAT Gateway
NAT 게이트웨이 - Amazon Virtual Private Cloud
RDS Proxy
Amazon RDS 프록시 사용 - Amazon Relational Database Service
Lambda Web Adapter
Web Adapter Githuib
https://github.com/awslabs/aws-lambda-web-adapter
Using response streaming with AWS Lambda Web Adapter to optimize performance | Amazon Web Services
Terraform
AWS_IAM_POLICY
AWS_NAT_GATEWAY
'회고록 > 업무 기록' 카테고리의 다른 글
AWS SAM과 Lambda Web Adapter를 사용한 실무 인프라 전환기 [1/2] (2) | 2024.09.01 |
---|