AWS - Lambda + ApiGateway + SQS

jsbak·2023년 7월 7일
0

참고

목록 보기
12/13

콘솔 대시보드를 통한 리소스 생성

Terraform 으로 리소스 생성

  • Terraform - AWS Lambda via SQS - 2022.8.21
  • 🔥 How to enable CORS on API Gateway with Lambda proxy integration? - Andreas Wittig – 21 Oct 2020 - Lambda 프록시 통합으로 API Gateway에서 CORS를 활성화하는 방법은 무엇입니까? 🔥
    • 요약
      • Lambda 프록시 통합을 사용할 때 서버리스 애플리케이션의 백엔드에서 CORS를 활성화하려면 다음 단계가 필요
      1. Lambda 함수로 CORS 헤더 추가 구현
      2. OPTIONS 요청에 대한 정적 응답 추가
      3. 서버 측 오류에 CORS 헤더 추가
      • 그런데 SPA와 동일한 도메인 뒤에서 API 게이트웨이를 실행하여 CORS를 완전히 피할 수도 있습니다. 예를 들어 요청을 myapp.com/api/*지역 API 게이트웨이로 라우팅하고 다른 모든 것은 S3 버킷으로 라우팅하도록 CloudFront를 구성

AWS Lambda

  • AssumeRole 작업을 사용하여 역할을 가정할 수 있도록 허용
    • AWS 서비스에서 위임할 수 있는 IAM 역할을 서비스 역할 이라고 합니다. 서비스 역할에는 신뢰 정책이 포함되어 있어야 합니다.
      • 서비스 역할 : 서비스가 사용자를 대신하여 작업을 수행하기 위해 수임하는 IAM 역할
    • 서비스 보안주체
  • IAM Role 생성 및 assume role policy 연결
  • 필요한 IAM Policy 정책 생성 및 IAM Role 에 연결
  • CloudWatch 생성
  • Lambda 생성
    • IAM Role 연동
    • depends_on 을 통해 cloudwatch 연동

API Gateway

  • API 게이트웨이 생성
  • API 리소스 생성
  • API 리소스에 포함할 메서드 생성
  • API 게이트웨이 통합
  • API 게이트웨이 람다 함수 실행 권한 부여
  • API 게이트웨이 스테이지 생성
  • API 게이트웨이 배포

lambda & api gateway 통합

참고

cors 관련 처리

ERROR 메시지도 확인해보려면 Lambda 함수 응답에서 헤더 설정해야한다.

  • 설정하지 않으면 CORS 등 다른 요소로 표현될 수도 있다.

    
    import { SQSClient, SendMessageCommand } from "@aws-sdk/client-sqs";
    import { v4 as uuidv4 } from "uuid";
    
    const sqs = new SQSClient({ region: "ap-northeast-2" });
    
    export const handler = async (event) => {
      try {
        const requestBody = JSON.parse(event.body);
        const randomUUID = uuidv4();
    
        ...
    
        return {
          statusCode: 200,
          headers: {
            "Access-Control-Allow-Headers": "Origin,Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "GET,POST,PUT,DELETE,OPTIONS",
          },
          body: message,
        };
      } catch (error) {
        console.error("Error sending message:", error);
        return {
          statusCode: 500,
          headers: {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "*"  // CORS 설정
          },
          body: JSON.stringify({ error: "Error sending message to SQS" })
        };
      }
    };
    

Invalid permissions on Lambda function

SampleApiPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !Ref MyLambdaFnA1
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/*/<method>/<resource>"
      #SourceArn: !Join
      #  - ''
      #  - - 'arn:aws:execute-api:'
      #    - !Ref AWS::Region
      #    - ":"
      #    - !Ref AWS::AccountId
      #    - ":"
      #    - !Ref MscOscApi
      #    - "/*/*"
profile
끄적끄적 쓰는곳

0개의 댓글