23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
AWS CDK(Cloud Development Kit)는 클라우드 인프라를 코드로 정의하고 프로비저닝할 수 있는 강력한 프레임워크입니다.
TypeScript, Python, Java 등 익숙한 프로그래밍 언어를 사용하여 AWS 리소스를 관리할 수 있습니다.
특히 AWS 공식 문서와 다양한 핸즈온 예제들에서 CDK를 적극적으로 활용하고 있습니다.
개발자들은 Github나 AWS 공식 사이트 등에서 어렵지 않게 구할 수 있는 CDK 프로젝트의 빌드 및 실행을 통해 실제로 클라우드 인프라를 구성하고 실행해 볼 수 있습니다.
이를 통해 손쉽게 AWS 인프라를 학습하고 클라우드 웹 서비스의 구성을 경험해볼 수 있습니다.
그러나 웹 상에서 얻은 좋은 예제들도 빠르게 진행되는 CDK의 소프트웨어 업데이트 및 AWS 클라우드 인프라 정책의 변경으로 실행에 어려움을 겪게 되는 경우가 많습니다.
최근에 저도 묵혀놓았던 CDK 프로젝트를 다시 꺼내어 기존에 작성된 CDK코드를 그대로 사용하여 클라우드에 배포를 해보았는데요.
생각처럼 한번에 되지 않아 어려움을 겪고 웹 검색 및 문서들을 참조하여 해결할 수 있었습니다.
그 때의 경험했던 이슈들을 정리하고 그 외 잠재적으로 발생가능한 문제점들에 대해 정리해보았습니다.
#### CDK 버전 체계 이해하기
AWS CDK는 메이저.마이너.패치 형식의 시맨틱 버전 관리를 사용합니다. 마이너 및 패치 릴리스는 이전 버전과 호환되며, 동일한 메이저 버전 내에서는 안전하게 업그레이드할 수 있습니다.
#### CDK v1에서 v2로의 전환
CDK v1은 2023년 6월 1일부로 지원이 종료되었습니다.
각 모듈별 Import 방식이 aws-cdk-lib로 통합되었습니다.
이전 버전의 구문과 새로운 버전의 구문이 호환되지 않는 경우가 있습니다
v1에서 v2로 전환할 때는 다음 단계를 따르는 것이 좋습니다:
1단계: 의존성 업데이트
npm install aws-cdk-lib@latest
npm uninstall @aws-cdk/aws-s3 @aws-cdk/aws-lambda2단계: 임포트 구문 변경
// 기존 v1
import { Construct, App, Stack } from "@aws-cdk/core";
// 새로운 v2
import { Construct } from 'constructs';
import { App, Stack } from 'aws-cdk-lib';더 이상 사용되지 않는 구성요소들이 존재합니다
이전 버전의 코드를 그대로 실행하면 경고나 오류가 발생할 수 있습니다
오래 전에 구성해 놓았던 CDK프로젝트를 AWS인프라에 재배포해보았는데 역시 한번에 되지 않았습니다.
소프트웨어 패키지나 라이브러리의 버전을 업데이트하고 난 후에도 여러가지 에러가 있었습니다.
가장 먼저 마주했던 문제는 ECS클러스터를 구성하는 스택에서 발생 하였습니다.
에러 메시지를 분석하고 검색해보니 AutoScalingGroup을 설정하여 배포하는데 필요하였던 Autoscailing configuration구문이 더 이상 사용되지 않아 발생하는 문제였습니다.
아래의 aws-cdk 공식 Github의 issue에서 관련한 문제에 대해 알 수 있습니다.
aws-autoscaling: Use launch templates instead of deprecated launch configurations #23165
AWS::AutoScaling::LaunchConfiguration 유저가이드 문서에도 Launch Configuration을 사용하지 말고 Launch Template을 사용할 것을 강력 권고하고 있네요.
아마도 CDK으 특정 버전 이상부터는 사용이 되지 않도록 강제 되어있는 것 같습니다.
다음과 같이 Launch configuration을 사용하는 코드를 Launch Template을 사용하는 구문으로 변경해주고 나서야 구성한 ECS Cluster를 배포 완료할 수 있었습니다.
diff --git a/infra/stack/common/ecs-cluster-stack.ts b/infra/stack/common/ecs-cluster-stack.ts
index e7b59ad..999dcbc 100644
--- a/infra/stack/common/ecs-cluster-stack.ts
+++ b/infra/stack/common/ecs-cluster-stack.ts
@@ -2,6 +2,7 @@ import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as asg from 'aws-cdk-lib/aws-autoscaling';
import * as sd from 'aws-cdk-lib/aws-servicediscovery';
+import * as iam from 'aws-cdk-lib/aws-iam';
import * as base from '../../../lib/template/stack/base/base-stack';
import { AppContext } from '../../../lib/template/app-context';
@@ -31,21 +32,41 @@ export class EcsClusterStack extends base.BaseStack {
});
if (this.stackConfig.ProviderEnable) {
+ const ltRole = new iam.Role(this, 'EcsClusterRole', {
+ roleName: 'ecs-cluster-role',
+ assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
+ managedPolicies: [
+ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
+ iam.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy'),
+ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2ContainerRegistryReadOnly'),
+ iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonEC2ContainerServiceforEC2Role'),
+ ],
diff --git a/infra/stack/common/ecs-cluster-stack.ts b/infra/stack/common/ecs-cluster-stack.ts
index e7b59ad..999dcbc 100644
--- a/infra/stack/common/ecs-cluster-stack.ts
+++ b/infra/stack/common/ecs-cluster-stack.ts
@@ -2,6 +2,7 @@ import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as asg from 'aws-cdk-lib/aws-autoscaling';
import * as sd from 'aws-cdk-lib/aws-servicediscovery';
+import * as iam from 'aws-cdk-lib/aws-iam';
import * as base from '../../../lib/template/stack/base/base-stack';
import { AppContext } from '../../../lib/template/app-context';
@@ -31,21 +32,41 @@ export class EcsClusterStack extends base.BaseStack {
});
if (this.stackConfig.ProviderEnable) {
+ const ltRole = new iam.Role(this, 'EcsClusterRole', {
+ roleName: 'ecs-cluster-role',
+ assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
+ managedPolicies: [
+ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
+ iam.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy'),
+ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2ContainerRegistryReadOnly'),
+ iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonEC2ContainerServiceforEC2Role'),
+ ],Launch Template에 대한 Reference는 다음을 참고하세요.
AWS::EC2::LaunchTemplate User Guide
ECS Cluster와 관련된 스택의 문제를 해결하고, 계속해서 다른 스택의 배포를 진행하였는데 역시 바로 되지 않았습니다.
에러 메시지의 내용은 해당 스택에서 사용하는 Lambda의 Runtime이 python3.7을 사용하는데 더 이상 지원되지 않으니 Runtime을 업데이트하라는 내용이었습니다.
하지만 해당 스택은 'aws_s3_deployment' class library의 내부에 구현되어있는 'BucketDeployment' method를 이용하는 스택이었습니다.
내부에서 Lambda function을 구성하도록 구현되어있고 Lambda runtime을 설정하는 property가 없었기 때문에 해결 방법을 바로 떠올리기가 쉽지 않았습니다.
CREATE_FAILED | AWS::Lambda::Function | Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C1024MiB1024MiB (CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C1024MiB1024MiB6D9F8D19) Resource handler returned message: "The runtime parameter of python3.7 is no longer supported for creating or updating AWS Lambda functions. We recommend you use a supported runtime while creating or updating functions. (Service: Lambda, ... "이 문제도 아래의 aws-cdk의 공식 Github의 issue에서 찾을 수 있었습니다.
(aws-s3-deployment): BucketDeployment creates Lambda function with unsupported runtime #21467
특정버전 이하의 cdk라이브러리에서 BucketDeployment 메소드 사용시 Lambda runtime의 구성을 python3.7을 기본을 설정하도록 되어있는 것으로 보입니다.
Typescript에서는 라이브러리 패키지의 의존성 괸리를 위해 'package.json' 파일을 사용합니다.
기존 프로젝트에서는 '2.33.0' 버전의 cdk라이브러리를 사용하고 있었고 이를 최신 버전인 '2.178.1'로 변경하였습니다.
'package.json' :
- "aws-cdk-lib": "2.33.0",
+ "aws-cdk-lib": "^2.178.1",이렇게 임의로 버전을 변경하면 의존성이 틀어지기 때문에 'npm audit fix' 명령을 통해 dependency tree의 의존성 문제 및 보안취약점들을 해결하고 패키지를 업데이트를 하게 됩니다.
경우에 따라 '--force' 인자를 주어야 할 때가 있는데 기존 버전과의 호환성 및 보안취약점 문제가 있을 수 있으므로 패키지들의 버전에 따라 적절히 적용을 해주어야 합니다.
마지막으로 'package-lock-.json'으로 저장하고 코드 저장소에 반영하여 추후에도 동일한 패키지로 빌드되어 인프라 배포가 가능하도록 합니다.
npm audit fix (--force)
npm update (--force)
npm update --save (--force)이렇게 조치 후 배포하여 하위버전의 'BucketDeployment'에서의 Lambda runtime 관련 버그를 해결할 수 있었습니다.
검색을 해보면 이 외에도 그동안의 버전 업데이트와 그에 따른 라이브러리 패키지의 하위호환성과 AWS 클라우드 인프라의 변경과 관련된 잠재적 문제들이 있을 수 있습니다.
태스크 정의 방식의 변경
컨테이너 로깅 구성 방식의 변화
새로운 관리형 정책으로의 마이그레이션 필요
사용자 지정 정책의 문법 변경
VPC 엔드포인트 구성 방식의 변경
보안 그룹 규칙 정의 방식의 업데이트
CDK는 AWS를 이용해 하위 인프라를 구성하는 것에서 부터 전체 시스템 및 상위 어플리케이션을 통합하여 구성하고 관리할 수 있는 매우 유연하고 편리하고 강력한 기능을 제공합니다.
그러나 모든 소프트웨어 기반 웹서비스들이 그렇듯 기능과 성능을 유지보수 위해서는 지속적인 관리 및 업데이트가 필요합니다.
위에서 소개한 내용들 이외에도 CDK로 클라우드 인프라를 구성하여 시스템을 개발하고,
오랜시간 운영 및 유지 보수를 하다보면 라이브러리 및 인프라의 변경과 업데이트 그리고 정책의 변경으로 인한 다양한 문제가 발생할 수 있습니다.
소프트웨어 라이브러리는 물론 클라우드 인프라 또한 살아있는 유기체처럼 계속 발전하고 변화하기 때문에 이는 당연한 문제일 수 있습니다.
이런 인식들을 바탕으로 아래의 내용들로 시스템을 지속적으로 유지하면 위와 같은 문제들을 갑작스럽게 마주하는 상황이 적어질 것입니다.
정기적인 CDK 버전 업데이트 수행 및 AWS CLI 최신 버전 유지
버전 업데이트시 AWS 공식 문서의 마이그레이션 가이드 참조
변경 사항 적용 전 테스트 환경에서 검증
버전 관리를 통한 롤백 계획 수립
이러한 고려사항들을 미리 파악하고 대비한다면, CDK 프로젝트의 버전 관리를 보다 안전하고 효율적으로 진행할 수 있을 것입니다.
끝.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.