Terraform으로 AWS Amplify 구축
졸업 작품팀에서 나는 백엔드 파트 및 인프라 구축을 담당하게 되었다. Front-End 파트에서 GitHub에 Pull-Request 시 AWS Amplify를 통한 페이지 미리보기가 필요하다는 요청이 있었고, 이를 위해 Terraform을 통해 리소스를 관리하기로 하였다.
AWS Amplify란
AWS에서 제공하는 서비스의 일종으로 모바일 및 웹 애플리케이션 개발을 간소화하기 위해 사용되는 완전 관리형 서비스이다. 애플리케이션의 코드 Repository(GitHub, GitLab, BitBucket 등을 지원함)를 연결하여 코드를 커밋할 때마다 변경 사항이 단일 워크플로를 통해 배포된다.
Front-End의 요구사항
우리 프로젝트의 Front-End 팀의 요구사항은 다음과 같았다. GitHub를 통해 Pull-Request를 작성하고 이를 병합하기 전 미리보기 페이지가 있었으면 좋겠다는 내용이었다. 이미 Front-End에서 자체적으로(Terraform)을 사용하지 않고 시도해본 기능이였고 성공적으로 동작하는 것을 확인하였기 때문에, 필자는 이를 Terraform 코드로만 옮기면 되는 작업이었다. 자세한 내용은 아래 References
를 참고하길 바란다.
작업 내용
variables.tf
# GitHub Repository에 접근하기 위한 GitHub 계정의 Access Token
variable "github_access_token" {
type = string
}
AWS Amplify를 구축하기 위해 필요한 변수이다. GitHub의 Pull-Request에 접근해야 하므로, 이를 위해 Admin 권한이 있는 GitHub 계정의 Access Token을 사용하였다.
main.tf - “aws_amplify_app” 리소스
resource "aws_amplify_app" "app" {
name = "pennyway-web-test"
repository = "https://github.com/${organization명}/${Repository명}"
oauth_token = var.github_access_token
build_spec = <<-EOT
version: 1
frontend:
phases:
preBuild:
commands:
- yarn install
build:
commands:
- yarn run build
artifacts:
baseDirectory: dist
files:
- '**/*'
cache:
paths:
- node_modules/**/*
EOT
environment_variables = {
# 추후 환경 변수 추가
}
}
name
: AWS Amplify의 Resource명repository
: 소스코드 저장소(필자의 경우 GitHub Repository) 주소oauth_token
: GitHub Repository에 접근할 권한이 있는 계정의 Access Tokenbuild_spec
: AWS Amplify를 사용하여 페이지를 배포하기 위해 필요한 워크플로우enviroment_variables
: Front-End에서 사용하는 환경 변수들
main.tf - “aws_amplify_branch” 리소스
이 리소스의 경우에는 Pull-Request가 작성되었을 때, head_branch
를 설정하는 리소스이다. 필자의 경우에는 Front-End의 브랜치 전략이 GitHub Flow
였기 때문에 main
브랜치만 설정해두었다.
app_id
:aws_amplify_app
리소스의 idbranch_name
: Pull-Request가 작성되었을 때,head_branch
명enable_pull_request_preview
: 필자의 경우에는 Pull-Request가 작성되었을 때 미리보기 용도로 사용하는 것이기 때문에true
로 설정함pull_request_environment_name
: 이 부분이 가장 헷갈리던 부분이다. 아래 이미지와 같이 기본적으로 해당 속성의 값은 리소스가 생성되었을 때pr
로 설정되는데, 이는terraform apply
를 했을 때, 리소스가 생성될 때의 속성값(null)과 달라져 아무 변경사항이 없는데도changed
가 발생했었다. (자세한 사항은 아래 Pull-Request에서 확인)
적용 결과
Amplify GitHub App
Amplify Hosting
관련 Pull-Request
IaC Repository PR
: https://github.com/CollaBu/pennyway-iac/pull/5Front-End Repository PR
: https://github.com/CollaBu/pennyway-client-webview/pull/5
현재 AWS Architecture
현재 Architecture를 그리면서 고민되는 부분은 Amplify가 AWS Cloud가 제공하는 서비스에 속하는 것은 맞지만, 일반 Client가 접근할 수 있는 것은 아니라는 점(사실 GitHub Repository를 통해 접근할 수 있긴 함)이다. Client 외의 역할(Developer?)를 추가하는 것을 고려하고 있다.