AWS Elastic Beanstalk에서 웹 앱 배포

시작 안내서

모듈 2: AWS CDK를 사용하여 인프라 생성

이 모듈에서는 CDK 애플리케이션을 생성합니다. 이 애플리케이션은 Elastic Beanstalk를 사용하여 NodeJS 웹 앱을 배포하기 위해 필요한 모든 인프라를 생성합니다.

소개

이 모듈에서는 CDK 애플리케이션을 생성합니다. 이 애플리케이션은 AWS Elastic Beanstalk를 사용하여 NodeJS 웹 앱을 배포하기 위해 필요한 모든 인프라를 생성합니다.

배우게 될 내용

  • 단순 CDK 애플리케이션 생성
  • S3 자산을 사용하여 패키지를 S3에 업로드
  • Elastic Beanstalk CDK 앱, 앱 버전 및 환경 생성

 완료 시간

15분

 모듈 선행 조건

  • 관리자 수준의 액세스 권한이 있는 AWS 계정**
  • 권장 브라우저: 최신 버전의 Chrome 또는 Firefox

[**]생성된 지 24시간이 지나지 않은 계정은 이 자습서를 완료하는 데 필요한 서비스에 액세스할 권한이 아직 없을 수 있습니다.

구현

CDK 앱 생성

최신 CDK 버전을 보유하고 있는지 확인하십시오.

npm install -g cdk

신규 디렉터리를 생성하고 디렉터리로 들어갑니다.

mkdir cdk-eb-infra
cd cdk-eb-infra

인프라에서 사용할 CDK 애플리케이션을 초기화합니다.

cdk init app --language typescript

리소스 스택에 대한 코드 생성

파일 /lib/cdk-eb-infra-stack.ts로 이동합니다. 생성하려는 리소스 스택에 대한 코드를 작성할 위치입니다. 

리소스 스택은 특정 계정에 프로비저닝될 클라우드 인프라 리소스의 집합(특정한 경우 모든 AWS 리소스)입니다. 이 리소스가 프로비저닝되는 계정은 필수 단계에서 구성한 스택입니다. 이 리소스 스택에서는 이 리소스를 생성하게 됩니다.

  • S3 자산: S3에 압축한 애플리케이션을 업로드하도록 지원하며, 객체 위치를 얻을 수 있는 방법으로 CDK 애플리케이션을 제공합니다.
  • Elastic Beanstalk 앱: Elastic Beanstalk 구성 요소의 논리적 모음으로 환경, 버전 및 환경 구성을 포함합니다.
  • Elastic Beanstalk 앱 버전: 웹 애플리케이션에 대한 배포 가능한 코드의 특정의 레이블을 지정한 반복을 말합니다. Amazon Simple Storage Service(Amazon S3) 객체를 가리키는 애플리케이션 버전으로, 배포 가능한 코드를 포함합니다. 사용자의 경우에는 S3 자산을 사용하여 S3에 업로드할 zip 파일입니다. 애플리케이션에는 다양한 버전이 있을 수 있으며, 각 애플리케이션 버전은 고유합니다.
  • 인스턴스 프로파일 및 역할: AWS Identity and Access Management(IAM) 역할의 컨테이너로, 사용자는 인스턴스 시작 시 이를 사용하여 역할 정보를 Amazon EC2 인스턴스로 보낼 수 있습니다.
  • Elastic Beanstalk 환경: 애플리케이션 버전을 구현하는 AWS 리소스의 모음입니다. 각 환경은 한 번에 단 하나의 애플리케이션 버전만을 구동합니다.

앱을 자동으로 S3에 업로드

웹 앱을 배포하려면 패키지가 필요하며, 이 패키지를 Elastic Beanstalk에 대한 Amazon Simple Storage Service(S3)에 업로드하여 환경 내 그 애플리케이션에 배포해야 합니다.

이 가이드의 모듈 3 내 애플리케이션의 패키징을 수행할 것이나, 지금은 이것을 S3에 업로드하는 것에 집중합니다. 이를 수행하기 위해서는 S3Assets라는 이름의 CDK 구축자를 사용하게 됩니다. 이 모듈은 로컬 파일 및 디렉터리를 S3에 업로드합니다.

CDK 애플리케이션에서 이를 수행하기 위해 우선 aws-s3-assets 모듈을 설치해야 합니다.

npm i @aws-cdk/aws-s3-assets

그런 다음 lib/cdk-eb-infra-stack.ts 파일에서 파일 상단에 종속 파일을 추가합니다.

import s3assets = require('@aws-cdk/aws-s3-assets');

스택 내부에서 "The code that defines your stack goes here"라는 코멘트 라인 아래에 다음 코드를 추가합니다.

 // Construct an S3 asset from the ZIP located from directory up.
const webAppZipArchive = new s3assets.Asset(this, 'WebAppZip', {
      path: `${__dirname}/../app.zip`,
});

이 코드는 S3 자산 모듈을 사용하며 CDK 앱의 루트에 위치한 웹 앱의 zip 파일을 가져가 S3에 업로드합니다. 언제 zip 파일을 업로드하고 이 스택을 배포하든, 파일은 S3에 업로드됩니다.

Elastic Beanstalk CDK 종속 파일을 추가합니다.

Elastic Beanstalk 애플리케이션, 애플리케이션 버전 및 환경을 생성합니다. 그러면 S3 자산을 사용하여 S3에 방금 업로드한 웹 앱을 배포할 수 있습니다.

제일 먼저 CDK용 Elastic Beanstalk 모듈을 설치해야 합니다.

npm i @aws-cdk/aws-elasticbeanstalk

그런 다음 /lib/cdk-eb-infra-stack.ts 파일 상단에 종속 파일을 추가합니다.

import elasticbeanstalk = require('@aws-cdk/aws-elasticbeanstalk');

Elastic Beanstalk 애플리케이션 생성

이제 Elastic Beanstalk 앱을 생성할 수 있습니다. 앞서 언급했듯, Elastic Beanstalk 애플리케이션은 Elastic 폴더 등의 Beanstalk 구성 요소의 논리적 모음입니다.

이 코드를 S3Assets 코드 아래에 삽입합니다. 이 코드는 Elastic Beanstalk에 MyWebApp이라는 이름의 애플리케이션을 생성합니다.

// Create a ElasticBeanStalk app.
const appName = 'MyWebApp';
const app = new elasticbeanstalk.CfnApplication(this, 'Application', {
    applicationName: appName,
});

Elastic Beanstalk 애플리케이션 버전 생성

이제 이전에 생성한 S3 자산에서 애플리케이션 버전을 생성해야 합니다. 이 코드 조각은 S3 자산 및 CDK가 이 메서드에 제공할 S3 버킷 및 S3 객체 키를 사용하여 앱 버전을 생성하게 됩니다.

// Create an app version from the S3 asset defined earlier
const appVersionProps = new elasticbeanstalk.CfnApplicationVersion(this, 'AppVersion', {
    applicationName: appName,
    sourceBundle: {
        s3Bucket: webAppZipArchive.s3BucketName,
        s3Key: webAppZipArchive.s3ObjectKey,
    },
});

진행에 앞서, 앱 버전을 생성하기 전에 Elastic Beanstalk 애플리케이션이 존재하는지 확인하고자 한다면, 이 작업은 CDK를 사용하면 매우 쉽습니다.

// Make sure that Elastic Beanstalk app exists before creating an app version
appVersionProps.addDependsOn(app);

인스턴스 프로파일 생성

Elastic Beanstalk 환경을 생성하려면 기존 인스턴스 프로파일 이름을 제공해야 합니다.

인스턴스 프로파일은 AWS Identity and Access Management(IAM) 역할의 컨테이너로, 사용자는 인스턴스 시작 시 이를 사용하여 역할 정보를 Amazon EC2 인스턴스로 보낼 수 있습니다.

이 경우에는 해당 역할이 관리형 정책(AWSElasticBeanstalkWebTier)에 첨부됩니다. 이 정책은 애플리케이션에 Amazon S3에 로그를, 그리고 AWS X-Ray에 디버깅 정보를 업로드하도록 허가합니다.

첫 번째로 해야 하는 것은 CDK 앱에 IAM 모듈을 설치하는 것입니다.

npm i @aws-cdk/aws-iam

그런 다음 작업한 CDK 스택에서 종속 파일을 임포트합니다.

import iam = require('@aws-cdk/aws-iam');

애플리케이션 버전을 생성하기 위한 코드 작업 후 이 코드를 추가합니다.

// Create role and instance profile
const myRole = new iam.Role(this, `${appName}-aws-elasticbeanstalk-ec2-role`, {
    assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});

const managedPolicy = iam.ManagedPolicy.fromAwsManagedPolicyName('AWSElasticBeanstalkWebTier')
myRole.addManagedPolicy(managedPolicy);

const myProfileName = `${appName}-InstanceProfile`

const instanceProfile = new iam.CfnInstanceProfile(this, myProfileName, {
    instanceProfileName: myProfileName,
    roles: [
        myRole.roleName
    ]
});

첫 번째로 해당 코드가 수행하는 역할은 신규 IAM 역할(myRole)입니다.

환경 내 EC2 인스턴스를 허용하여 해당 역할을 가정하기 위해, 인스턴스 프로파일은 Amazon EC2를 신뢰 관계 정책 내 신뢰 엔터티로 지정합니다.

그런 다음 그 역할에 관리형 정책 AWSElasticBeanstalkWebTier를 추가하며, 그리고 나서 해당 역할과 프로필 이름을 사용하여 인스턴스 프로필을 생성합니다.

Elastic Beanstalk 환경 생성

마지막으로 Elastic Beanstalk 환경을 생성해야 합니다. 이 환경은 애플리케이션 버전을 구현하는 AWS 리소스의 모음입니다. 이 환경을 위해 약간의 인프라 정보를 제공해야 합니다.

환경을 생성해 봅시다. 환경 생성 시 Elastic Beanstalk 콘솔에서 보여질 이름을 부여해야 합니다. 이 경우에는 환경을 MyWebAppEnvironment라고 명명합니다.

그런 다음 애플리케이션 이름을 부여해야 합니다. Elastic Beanstalk 정의에서 얻을 수 있습니다.

솔루션 스택 이름은 Elastic Beanstalk이 웹 애플리케이션을 구동하기 위해 제공하는 관리형 플랫폼의 이름입니다. 적절한 솔루션 이름을 사용하여 Elastic Beanstalk가 애플리케이션에 적절한 리소스를 제공합니다. 그 예시로 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 있습니다. 웹 앱을 개발하고자 선택한 프레임워크 및 플랫폼에 따라 적절한 소프트웨어 스택을 선택해야 합니다. 이 특정 사례의 경우 이 '64bit Amazon Linux 2 v5.4.4 running Node.js 14' 스트링을 삽입합니다. 이 스트링의 출처가 궁금하다면 이 모듈의 마지막에 솔루션 스택 이름에 대한 더 많은 정보가 있습니다.

옵션 설정 속성은 사용자가 Elastic Beanstalk 환경을 필요에 따라 구성할 수 있게 해줍니다.

  • IamInstanceProfile: 여기서는 이전 단계에서 생성한 인스턴스 프로파일을 참조합니다.
  • MinSize, MaxSize 및 InstanceTypes: 인스턴스에 대한 구성이며 Elastic Beanstalk가 사용자를 위해 생성하는 자동 크기 조정 그룹입니다. 이것은 선택적 파라미터로, 사용자가 설정하지 않으면 Elastic Beanstalk가 인스턴스 유형과 자동 크기 조정 그룹의 최소 및 최대 크기를 플랫폼 정의에 따라 선택합니다. 이것들을 정의하였으므로 AWS 프리 티어 내에 머무를 수 있습니다.

Elastic Beanstalk 구성 옵션에 대한 자세한 정보

이 모든 구성 옵션을 정의하기 위해, 다음 코드 라인을 추가합니다.

// Example of some options which can be configured
const optionSettingProperties: elasticbeanstalk.CfnEnvironment.OptionSettingProperty[] = [
    {
        namespace: 'aws:autoscaling:launchconfiguration',
        optionName: 'IamInstanceProfile',
        value: myProfileName,
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MinSize',
        value: '1',
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MaxSize',
        value: '1',
    },
    {
        namespace: 'aws:ec2:instances',
        optionName: 'InstanceTypes',
        value: 't2.micro',
    },
];

마침내 버전 레이블이 지정되었습니다. 버전 레이블은 중요 속성으로 방금 생성한 애플리케이션 버전을 참조하기 위해 필요합니다.

이 모든 정보를 통해 Elastic Beanstalk 환경을 생성할 수 있습니다.

이 코드를 스택 정의 파일에 붙여넣기합니다.

// Create an Elastic Beanstalk environment to run the application
const elbEnv = new elasticbeanstalk.CfnEnvironment(this, 'Environment', {
    environmentName: 'MyWebAppEnvironment',
    applicationName: app.applicationName || appName,
    solutionStackName: '64bit Amazon Linux 2 v5.4.4 running Node.js 14',
    optionSettings: optionSettingProperties,
    versionLabel: appVersionProps.ref,
});

일반적인 실수

CDK 라이브러리의 다양한 버전 사용

CDK를 사용할 때 일어날 수 있는 한 가지 흔한 오류는, 라이브러리를 임포트하여 애플리케이션에서 사용하기 시작할 때 단어 “this”가 강조 표시되고 컴파일 문제를 볼 수 있습니다.

gsg_build_elb_1

이는 CDK 코어 라이브러리와 다른 버전의 CDK 모듈을 사용했기 때문에 일어날 수 있습니다. CDK는 매우 자주 업데이트되기에 이것은 아주 일반적인 오류입니다.

이 문제를 해결하기 위해서는 모든 cdk 패키지를 동일한 버전으로 업데이트해야 합니다. CDK 애플리케이션의 package.json 파일에서 CDK 패키지의 버전을 볼 수 있습니다.

gsg_build_elb_2

추가 정보

Elastic Beanstalk 스택 이름에 대한 자세한 정보

설명서에서 Elastic Beanstalk용 지원 플랫폼 전체를 볼 수 있습니다. 이 페이지는 새 플랫폼을 추가하고 오래된 플랫폼을 사용 중지하도록 계속해서 업데이트됩니다.

적절한 플랫폼 이름을 얻는 방법이 궁금한 경우(예: 64bit Amazon Linux 2 v5.4.4 running Node.js 14) AWS CLI를 사용하고 지원하는 플랫폼 전체의 목록을 얻을 수 있습니다.

aws elasticbeanstalk list-available-solution-stacks

지원하는 플랫폼 스트링의 긴 목록으로 돌아왔으며 사용자의 CDK 애플리케이션에서 사용할 수 있습니다.

결론

이 모듈에서는 Elastic Beanstalk의 모든 필수 리소스를 생성하여 애플리케이션을 자동으로 배포하는 방법에 대해 배웠습니다. 다음 모듈에서는 이를 클라우드에 배포하는 방법과 변경 사항이 있을 때 앱을 업데이트하는 방법에 대해 알아봅니다.

다음: 애플리케이션 배포

내용이 마음에 드셨는지요.

피드백을 제공해 주셔서 감사합니다.
이 페이지가 도움이 되어 기쁩니다. 지속적인 개선에 도움이 되는 추가 세부 정보를 공유해 주시겠습니까?
닫기
피드백을 제공해 주셔서 감사합니다.
이 페이지가 도움이 되지 못해 죄송합니다. 지속적인 개선에 도움이 되는 추가 세부 정보를 공유해 주시겠습니까?
닫기