API Gateway를 사용할 때 CORS를 테라폼을 이용해 제어하는 방법은 다음과 같다.
resp, err := service.PostCommunity(&LambdaProperties)
if err != nil {
return events.APIGatewayProxyResponse{Body: err.Error(), StatusCode: 500,
Headers: map[string]string{
"Access-Control-Allow-Headers": "Content-Type",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "OPTIONS,POST,GET",
},
}, nil
} else {
return events.APIGatewayProxyResponse{Body: string(resp), StatusCode: 200,
Headers: map[string]string{
"Access-Control-Allow-Headers": "Content-Type",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "OPTIONS,POST,GET",
},
}, nil
}
위와 같이 Access-Control-Allow-Headers
Access-Control-Allow-Origin
Access-Control-Allow-Methods
세가지 옵션을 응답헤더로 설정해준다.
두 번째로 해야할 것은 작성중인 리소스에 prefilght 요청을 허용해주기 위해서 Option 메소드를 추가해주는 작업을 해야한다. 관련 메소드를 생성해주는 모듈이 있어서 사용했다.
module "community_cors" {
source = "squidfunk/api-gateway-enable-cors/aws"
version = "0.3.3"
api_id = aws_api_gateway_rest_api.api.id
api_resource_id = aws_api_gateway_resource.community_root.id
}
위와 같이 api_id
와 api_resource_id
를 넣어주면 해당 리소스에 Option 메소드가 생성이 된다.
세 번째로 해야할 것은 작성중인 해당 메소드에 응답리소스를 만들어주는 것이다.
resource "aws_api_gateway_method_response" "post_community_response_200" {
rest_api_id = aws_api_gateway_rest_api.api.id
resource_id = aws_api_gateway_method.post_community.resource_id
http_method = aws_api_gateway_method.post_community.http_method
status_code = "200"
response_parameters = {
"method.response.header.Access-Control-Allow-Origin" = true
}
depends_on = [aws_api_gateway_method.post_community]
}
resource "aws_api_gateway_integration_response" "post_community_response_200" {
rest_api_id = aws_api_gateway_rest_api.api.id
resource_id = aws_api_gateway_method.post_community.resource_id
http_method = aws_api_gateway_method.post_community.http_method
status_code = "200"
depends_on = [aws_api_gateway_method.post_community]
}
위와 같이 aws_api_gateway_method_response
리소스에 response_parameters
로 method.response.header.Access-Control-Allow-Origin
를 true로 설정해준다.
생각보다 신경쓸 것이 많은 작업이었다. 서버가 있을때는 서버에서 CORS옵션을 설정해주면 끝이었지만, 서버리스로 작업을 하니 연결된 리소스마다 CORS관련 옵션을 설정해주어야한다. 그래도 옵션을 설정할 수 있는 방법이 있기 때문에 다행이라고 생각한다.