업무 중 API를 개발하고나서 매번 AWS 콘솔에서 환경 별 API Gateway에 리소스와 메서드를 배포해야하는 프로세스가 있었다.
매번 귀찮은 작업이기도 했고, 휴먼 에러로 인한 운영 환경의 문제를 발생 시키기도 하던 작업이었다.
그래서 얼마 전 IaC 개념을 배우고나서 코드로 이 작업을 처리하고, 어쩌면 최종적으로 Github Actions를 이용해 이 프로세스를 자동화할 수 있지 않을까 하여 시도해 보았다.
개발한 API에 대한 리소스와 HTTP Method를 생성.
- 리소스는 이미 생성되어 있을 수 있다.
Authorizer(권한 부여자) 설정
환경 별 elb(로드 밸런서) 주소에 대한 HTTP 통합 설정
{환경 별 elb endpoint}/{path}
형식으로 구성된 url이다.API Gateway 생성은 자동화 범위에 포함되지 않기 때문에 미리 환경 별 API Gateway를 3개 생성해두었다.
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))
# API_ID, HTTP_METHOD, AUTHORIZER_ID 등은 프로그램 실행 시 주입받는 값이다.
client.put_method(
restApiId=API_ID,
resourceId=resource_id,
httpMethod=HTTP_METHOD,
authorizationType="None",
authorizerId=AUTHORIZER_ID,
)
client.put_integration(
restApiId=API_ID,
resourceId=resource_id,
httpMethod=HTTP_METHOD,
type="HTTP_PROXY",
integrationHttpMethod=HTTP_METHOD,
uri=ENDPOINT + PATH,
connectionType="INTERNET",
)
client.create_deployment(restApiId=API_ID, stageName=STAGE_NAME)
코드 상단의 API_ID
, ENDPOINT
, PATH
, HTTP_METHOD
, AUTHORIZER_ID
, STAGE_NAME
을 새로 입력해주어야 한다.