블로그 릴레이 - AWS App Runner에 대해서 알아보았다
안녕하세요 생산지원 그룹 리테일 어플리케이션부의 김승연입니다.
본 블로그는 당사의 한국어 블로그 릴레이의 2025년 열여덟 번째 블로그입니다.
이번 블로그의 주제는 「AWS App Runner에 대해서 알아보았다」 입니다.
사실 늦은 감이 있습니다만, 사내에서 AWS App Runner를 사용하는 프로젝트도 늘고 있는 것 같은 느낌이 있어 이번에 개인적으로 AWS App Runner에 대해서 알아보았습니다.
AWS App Runner 란?
AWS App Runner 는 소스 코드 또는 컨테이너 이미지에서 AWS 클라우드의 확장 가능하고 안전한 웹 애플리케이션으로 직접 배포하는 빠르고 간단하며 비용 효율적인 방법을 제공하는 AWS 서비스입니다.
새로운 기술을 배우거나, 사용할 컴퓨팅 서비스를 결정하거나, AWS 리소스를 프로비저닝하고 구성하는 방법을 알 필요가 없습니다.
App Runner는 코드 또는 이미지 리포지토리에 직접 연결됩니다. 완전 관리형 운영, 고성능, 확장성 및 보안을 갖춘 자동 통합 및 전송 파이프라인을 제공합니다.
위의 설명에서도 볼 수 있듯 AWS App Runner란 소스 코드 또는 컨테이너 이미지를 이용 어플리케이션을 신속히 배포 서비스할 수 있는 AWS의 완전 관리형 서비스인 듯합니다.
AWS Management Console을 통한 배포
AWS Management Console를 통한 배포 형식은 두 가지로 나뉘는 거 같습니다.
참고로, 설명에서는 소스 코드만으로도 배포 가능하다고 합니다만, 내부적으로는 컨테이너 이미지를 생성 후 배포하는 형식인 거 같습니다.
소스 코드는 App Runner가 빌드하고 배포하는 애플리케이션 코드입니다. App Runner를 코드 리포지토리의 소스 디렉터리로 가리키고 프로그래밍 플랫폼 버전에 해당하는 적절한 런타임을 선택합니다. App Runner는 런타임의 기본 이미지와 애플리케이션 코드를 기반으로 이미지를 빌드합니다. 그런 다음이 이미지를 기반으로 컨테이너를 실행하는 서비스를 시작합니다.
개인적인 생각입니다만, AWS의 또 다른 완전 관리형 서비스인 AWS Elastic Beanstalk와 차이점은, AWS App Runner의 경우에는 더욱 컨테이너 환경에 초점을 맞춘 서비스로 보입니다.
실제로 App Runner를 소개할 때 "관리형 컨테이너 앱 서비스"라고 소개합니다만, 아마 컨테이너 환경에 초점을 맞춘 서비스라는 걸 강조하고 있는 게 아닌가 싶습니다.
AWS CDK 를 통한 배포
물론 CDK를 통한 배포도 가능합니다만, CDK의 경우에는 현재는 L2 Construct는 아직 제공되지 않는 것 같습니다.
소스코드로 작성한다면 아래와 같은 느낌이 될 것 같습니다.
...
export class IacStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// 1. ECR 생성
const repository = new Repository(this, 'ExampleRepository', {
repositoryName: 'example-repository',
imageTagMutability: TagMutability.IMMUTABLE,
});
// 2. Roles 생성
const accessRole = new Role(this, 'AppRunnerAccessRole', {
assumedBy: new ServicePrincipal('build.apprunner.amazonaws.com'),
})
const instanceRole = new Role(this, 'AppRunnerInstanceRole', {
assumedBy: new ServicePrincipal('tasks.apprunner.amazonaws.com'),
})
// 3. App Runner 생성
new CfnService(this, 'ExpressAppRunner', {
serviceName: 'express-app',
sourceConfiguration: {
authenticationConfiguration: {
accessRoleArn: accessRole.roleArn,
},
imageRepository: {
imageIdentifier: `${repository.repositoryUri}:latest`,
imageRepositoryType: 'ECR',
imageConfiguration: {
port: '3000',
runtimeEnvironmentVariables: []
},
},
autoDeploymentsEnabled: false,
},
instanceConfiguration: {
cpu: "1 vCPU",
memory: "2 GB",
instanceRoleArn: instanceRole.roleArn,
},
healthCheckConfiguration: {
path: '/',
protocol: 'HTTP',
interval: 5,
healthyThreshold: 1,
},
});
}
}
보충
CDK를 사용하는 경우 ECR생성후 아래와 같은 커맨드로 ECR에 Docker image를 Push 하는 과정이 필요합니다만, CDK에서 통합해서 할 수 있는 방법을 알아본 결과, cdk-docker-image-deployment와 같은 라이브러리를 사용하는 것 같습니다.
단, cdk-docker-image-deployment의 경우 내부적으로 docker 명령어를 사용하고 있는 듯하므로, finch 등을 사용하고 있는 경우에는 사용이 힘들 것 같습니다.
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com
docker build -t example-repository .
docker tag example-repository:latest ${REPOSITORY_URI}
docker push ${REPOSITORY_URI}
마지막으로
이상 한국어 블로그 릴레이의 열여덟 번째 블로그 「AWS App Runner에 대해서 알아보았다」였습니다.
다음에는 직접 CDK를 통해 ECR를 생성 App Runner에 간단히 배포해 보는 작업을 해보아도 좋을 것 같습니다.
참고자료