AWS API Gateway 환경 별 배포 자동화하기 (Prod, dev, test)

기석·2023년 11월 12일
2

Do it

목록 보기
1/2
post-thumbnail

서론

업무 중 API를 개발하고나서 매번 AWS 콘솔에서 환경 별 API Gateway에 리소스와 메서드를 배포해야하는 프로세스가 있었다.

매번 귀찮은 작업이기도 했고, 휴먼 에러로 인한 운영 환경의 문제를 발생 시키기도 하던 작업이었다.

그래서 얼마 전 IaC 개념을 배우고나서 코드로 이 작업을 처리하고, 어쩌면 최종적으로 Github Actions를 이용해 이 프로세스를 자동화할 수 있지 않을까 하여 시도해 보았다.

주의!!

  • 경험했던 프로세스를 자동화하려는데 의미를 두며, 이는 일반적인 프로세스와 다를 수 있습니다.

자동화 하려는 프로세스

  1. 개발한 API에 대한 리소스와 HTTP Method를 생성.

    -  리소스는 이미 생성되어 있을 수 있다.
  2. Authorizer(권한 부여자) 설정

    • 인증이 필요한 API를 설정하기 위해 사용했다.
    • Authorizer Lambda 함수를 이용해 인증을 처리했다.
  3. 환경 별 elb(로드 밸런서) 주소에 대한 HTTP 통합 설정

    • {환경 별 elb endpoint}/{path} 형식으로 구성된 url이다.

방법

  • AWS boto3와 Python을 이용하여 리소스와 메서드를 배포하는 코드를 작성한다.

0. API Gateway 생성

API Gateway 생성은 자동화 범위에 포함되지 않기 때문에 미리 환경 별 API Gateway를 3개 생성해두었다.

1. API path에 대한 Resource 생성

API Gateway에 /users/profile 리소스를 생성하려면, 아래 사진처럼 각 / -> users -> profile 리소스를 계층적으로 생성해주어야 한다.

리소스 생성 작업은 boto3의 create_resource 함수를 이용해 수행할 수 있다.

하지만 이 함수는 resource 생성을 위해 상위 resource의 식별 값을 알아야 한다는 점에서 문제가 있다.

그래서 path 값으로 resource를 생성하는 함수를 작성해보았다.

# if path: "/users/profile" -> users 리소스의 ID 
# "/", "users" 리소스가 없다면 생성
def get_parent_resource_id(path: str) -> str:
    paths = get_paths_by_level(path)
    parent_id = resources["/"]
    for p in paths[1:-1]:
        if p not in resources:
            resources[p] = create_resource(parent_id, get_path_name(p))
        parent_id = resources[p]

    return parent_id
    
def create_resource_by_path(path: str) -> str:
    return create_resource(get_parent_resource_id(path), get_path_name(path))

2. HTTP Method 생성

# API_ID, HTTP_METHOD, AUTHORIZER_ID 등은 프로그램 실행 시 주입받는 값이다.
client.put_method(
    restApiId=API_ID,
    resourceId=resource_id,
    httpMethod=HTTP_METHOD,
    authorizationType="None",
    authorizerId=AUTHORIZER_ID,
)

3. 통합 설정

client.put_integration(
    restApiId=API_ID,
    resourceId=resource_id,
    httpMethod=HTTP_METHOD,
    type="HTTP_PROXY",
    integrationHttpMethod=HTTP_METHOD,
    uri=ENDPOINT + PATH,
    connectionType="INTERNET",
)

4. API Gateway 배포

client.create_deployment(restApiId=API_ID, stageName=STAGE_NAME)

Github 링크

코드 상단의 API_ID, ENDPOINT, PATH, HTTP_METHOD, AUTHORIZER_ID, STAGE_NAME을 새로 입력해주어야 한다.

profile
블로그 이사갔어요 https://kiseoky.tistory.com

0개의 댓글

Powered by GraphCDN, the GraphQL CDN