AWS

대규모 배포 및 인프라에 관한 서비스 살펴보기

S_N_Y 2024. 3. 7. 11:40

 

대규모 배포 및 인프라에 관한 서비스를 같이 살펴보자🔭

 

#0 CloudFormation

<CloudFormation>

AWS에서 중요한 기술로 AWS 인프라의 모든 리소스에 대해 윤곽을 잡아준다. 구체적인 예시를 들면 CloudFormation에서 '보안 그룹'을 원하고 2개의 EC2 인스턴스가 해당 보안 그룹을 사용하는 상태에 S3 버킷을 원하고 로드 밸런서를 모든 머신 앞에 두고 싶다고 가정했을 때, CloudFormation이 자동으로 우리를 위해서 순서에 맞게 우리가 지정한 구성에 맞춰서 이것들을 만들어준다고 이해하면 된다!

- CloudFormation 사용 시, 얻는 이점들✅

1. 먼저 모든 인프라가 코드로 되어있어서 AWS 클라우드가 어떻게 동작할지 변경할 때마다 코드리뷰를 통해 검토할 수 있다. (지금까지 리소스를 수동으로 만들었었는데 만들지 않아도 된다!)

2. 비용 절감 측면 :추가로 그택 내에 만들어진 다른 모든 리소스와 비슷한 태그를 갖게 되어서 CloudFormation 템플릿을 사용해 쉽게 리소스의 비용을 추적할 수 있어 비용 절감의 효과도 있다고 한다.

3. 생산성 측면 : 즉시 인프라를 삭제하고 다시 만들 수 있고, 템플릿에 관한 도식(AWS에서 Stack Designer서비스가 있다)도 만들어줘서 좋다.

 

#1 CodeCommit - 깃헙🐱과 비슷한 것이 있다고?

 

이번엔 코드와 연관된 도구를 살펴보겠다💁

애플리케이션 코드를 서버로 푸쉬하기 전에 어딘가에 저장해야 하는데 개발자들은 주로 코드를 래포지토리에 저장하고 git을 이용해서 백업한다(주로 gitbub)

AWS에도 깃헙과 똑같은 경쟁 서비스가 있는데 그것이 CodeCommit이다. CodeCommit은 AWS의 버전 관리 레포지토리에 코드를 저장하는 방식이다. 따라서 git을 기반으로 한 레포지토리이다.

 

git 기반으로 하는 이유는 무엇일까? =>

git기반의 레포지토리가 있으면 개발자들이 코드로 협업하는 것이 쉽기 때문이다. 코드 변경 사하을 자동으로 버전관리가 되고 롤백이 되고 완전 관리형 코드 레포지토리에다 AWS 계정 내에 있어서 모든 AWS 서비스와 통합된다는 것이다.

 

#2 CodeBuild 🔨

이름 그대로 클라우드에서 코드를 설계하도록 한다.

소스 코드가 컴파일 되고 테스트가 실행되며 출력값으로 패키지가 생성되는데 패키지는 예를 들어 COdeDeploy로 서버에 배포된 준비가 되어서 애플리케이션을 실행하도록 한다.

이해를 위한 이미지

위의 그림을 보면 코드가 CodeCommit에 있고 CodeBuild는 CodeCommit에서 코드를 검색하고 정의해야 하는 스크립트를 실행하고 코드를 설계해서 배포 준비된 Artifact를 얻는다..!

왜 CodeBuild를 사용할까?🤔 =>

완전 관리형이고 서버리스이기 때문. 그리고 지속적으로 확장이 가능해서 좋고 빌드 시간에 대한 비용을 지불하면 되어서 코딩만 신경 쓰면 되고 CodeCommit 레포지토리에 푸쉬할 때마다 AWS 내 서비스에서 빌드 시간만 확인하면 된다.

 

#3 Code Pipeline - CodeCommit과 CodeBuild 연결하기 ⛓️

CodeCommit과 CodeBuild은 CodePipline이라는 것을 통해 연결할 수 있다. CodePipline은 코드가 자동으로 production에 푸쉬되도록 단계를 다르게 조정하는 방식이라고 한다.

=> 즉, 코드를 가져오는 Pipline을 정의하고 설계와 테스트를 하고 일부 서버를 프로비저닝 해서 해당 서버에 애플리케이션을 배포하는 것

이러한 단계를 조정하려면 파이프라인 tools가 필요한데 이것이 'CodePipline'

CodePipline는 CICD(지속적 통합/전달)가 베이스가 된다. 개발자가 레포지토리로 코드를 푸쉬할 때마다 구축되어 테스트가 되고 서버에 배포된다. CodePipline을 사용하는 이유는 똑같이 완전 관리형이며 많은 서비스와 호환이 되는데 심지어 다른 타사 서비스와도 호환이 된다는 좋은 점이 있다. 그리고 빠르고 자주 업데이트되어서 AWS 내의 CICD 서비스의 핵심으로 자리잡고 있다..!

 

#4  AWS CodeArtifact - dependencies(ex:gradle)를 바로 검색

개발자가 생성한 소프트웨어 패키지를 대게 서로 의존적으로 설계가 되는데 소프트웨어 패키지의 아키텍쳐와 같은 것(=코드 종속성)

이 디펜던시(우리가 쓰는 gradle 같은것)를 저장하고 검색하는 것을 Artifact 관리라고 한다. 기존에는 Amazon S3나 EC2 인스턴스의 사용자의 커스텀 소프트웨서에서 자체 Artifact 관리 시스템을 설정해야 해서 복잡했었다고 한다.

=> 그래서 안전하고 확장하기 좋으며 비용도 효율적인 소프트웨어 배포에 관한 AWS CodeArtifact(Artifact 관리 소프트웨어)가 나온 것이다.

지금은 자체 인프라를 설정하는 대신에 CodeArttifact를 사용할 수 있다. (geadle. Maven..같은 디펜던시 관리 툴이 CodeArttifact와 통신해서 코드 종속성을 저장하고 검색)

 

#5 CodeStar - 한 곳에서 관리하기

CodeStar는 개발 작업을 한 곳에서 쉽게 관리할 수 있다!

CodeCommit과 CodeBuild, CodeDepoly를 어떻게 설정할까? CodePipeline과 모두 통합해야 할까?

-> 통합하지 않고 CodeStar로 이 문제를 해결할 수 있다.

이런 식으로 깔끔하게 대시보드로 생성해준다.

백그라운드에서는 CodeCommit repository와 CodeBuild, CodeDepoly, CodePipeline가 생성되고 모니터링 등도 실행된다.

(Beanstalk 환경이나 EC2 인스턴스 등에서도 빠르게 시작할 수 있다.)

 

+) 바로 아래 나오는 개념 Cloud9으로 클라우드에서 바로 코드를 수정할 수 있다. 따라서 이 모든 것이 CodeStar를 핵심 서비스로 만들고 개발자가 CICD의 좋은 사례로 사용해서 빠르게 개발을 시작할 수 있다고 한다. 

 

#6 Cloud9 - AWS상 IDE

Cloud9이란 클라우드 IDE로 AWS에서 바로 코드를 읽고 실행하며 디버깅까지도 할 수 있다.

에디터 같은데 AWS내에서 실행되어서 웹 브라우저 상에서 실행된다.

인텔리제이, VS코드와 같은 IDE는 컴퓨터에 설치해야 하지만 이건 웹 브라우저에서 사용이 가능하다..!

그리고 인텔리제이의 Code with me같이 이것도 실시간으로 코드 협업이 가능하다.

 

#7 AWS Systems Manager(SSM)에 관하여

 

1) <SSM이란?>

SSM은 EC2 인스턴스와 온프레미스 시스템을 규모에 맞게 관리를 해준다.

(온프레미스와 AWS 모두를 관리하는 방법 = 하이브리드 AWS 서비스)

그리고 이름 그대로 System Manager이기 때문에 인프라 상태에 관한 운영 인사이트도 얻을 수 있다. 얻는 방법은 10가지의 방법(상품)들이 있는데 10가지가 넘어서 중요한 상품과 기능 몇 가지만 짚고 넘어가려고 한다.

- 규정을 준수하는 것을 강하게 하기 위해서 서버와 인스턴스에 자동패치를 적용할 수 있다.

- SSM에서 바로 전체 서버에 명령을 실행할 수 있다.

- SSM 파라미터를 저장하여 기본 구성을 저장할 수 있다.

=> SSM은 Windows와 Linux에서 실행된다..!

 

+) SSM의 원리

1.  먼저 제어하는 시스템에 SSM 에이전트를 설치해야 한다.

      - 여기서 SSM 에이전트는 백그라운드에서 실행될 작은 프로그램

      - AWS 상에서 Amazon Linux AMI나 Ubuntu AMI를 사용하면 기본적으로 설치된다.

2. EC2 인스턴스와 온프레미스 가상 머신에서는 전체에 SSM 에이전트를 설치해야 하고 SSM 에이전트는 AWS의 SSM 서비스에 다시 리포트를 전달하는 방식으로 이해하면 좋다. => 하이브리드 서비스 완성 

+) ⚠️ : SSM으로 인스턴스를 제어할 수 없는 경우가 있는데 에이전트 문제일 가능성이 높다. 

 

SSM으로 전체 서버에 명령을 실행(run)하거나 전체를 한 번에 패치하는 등 일관되게 구성할 수 있게 된다. 

 

2) < SSM Session Manager >

사례 분석에는 SSM Session Manager기능이 추가적으로 필요하다. 이 기능을 사용하면 EC2 인스턴스나 온프레미스 서버에 '시큐어 쉘(secure shell)' 을 시작할 수 있는데 SSH 액세스나 Bastion Host, SSH키가 필요없다..!

=> 그 말인 즉슨, EC2 인스턴스의 22번 port가 차단된다는 이야기이다. (SSH를 해서 EC2 인스턴스에 시큐어 셀을 설치할 필요가 없으니.. - 보안 증가⬆️)

 

이게 어떻게 가능할까?

아래에서 곧 시연할 EC2 인스턴스에서는 SSM 에이전트가 있는데 이 에이전트가 Session Manager에 연결되어 있다. 사용자들이 Session Manager를 통해 EC2 인스턴스를 액세스해서 명령을 실행할 수 있다는 것이다!

S3나 CloudWatch로 로그 데이터를 전송해서 보안을 강화할 수도 있다고 한다. 

+) 간단히 시연해보기

1. EC2 인스턴스를 만들 때 네트워크 설정에서 체크박스 다 풀기

위에서 보는 것처럼 EC2를 만들 때 보안 그룹을 두어서는 안 된다.

(HTTP, HTTPS, SSH도 없이 만들어야 SSM Session Manager를 셸로 사용할 수 있다!)

2. IAM 설정해줘야 해서 IAM 프로필 생성
3. AWS 서비스와 EC2 선택
3.  AmazonSSMManagedInstanceCore 설정 후 2번 상에서 적용하기
4. EC2가 만들어졌으면 systemManager -> 플릿메니저를 통해 이 인스턴스가 시큐어 쉘을 통해 실행할 준비가 되었다는 말이다.
5. 세션 관리자 -> 세션 시작 클릭
6. 세션 시작을 누르면 이런 식으로 시큐어 쉘이 시작되는 것을 볼 수 있다.(SSH를 액세스할 필요 X)

이런 식으로 SSM Secure Shell을 사용하면 SSH 보안 키나 SSH 액세스 없이도 AWS에서 바로 시큐어 쉘이 지원이 된다.

 

요약하자면 EC2 인스턴스로 액세스하는 방법이 3가지인데 첫 번째는 22번 포트를 연 다은 SSH키를 사용하는 것, EC2 Instance Connect를 이용하는 것, 지금 소개한 Session Manager를 이용하는 것으로 정리된다.

 

3) < Systems Manager Parameter Store >

구성 데이터나 암호를 안전하게 AWS에 저장해주는 방식인데 API키나 비밀번호, 구성 데이터 등 원하는 것을 모두 저장할 수 있다. (= 제공할 것이 없다. 확장이 가능하다.)

한 번에 여러 API호출에 응답할 수도 있고 사용도 간편하다. 무엇보다 안전해서 IAM을 사용해 parameter Store에 있는 각 파라미터의 액세스를 관리할 수 있기 때문에 좋다..!

게다가 구성 데이터나 파라미터를 진화시킬 수도 있다. -> 버전 체킹과 암호화(선택요소)가 가능하다.

Parameter Store에서 우리 애플리케이션이나 사용자는 일반 텍스트 구성과 암호화된 구성 데이터를 입력할 수 있는데 이때는 KMS로 암호화된다. -> 한 곳에서 수많은 애플리케이션 구성 데이터를 관리하고 중앙 집중식으로 저장할 수 있다고 한다. 

1. 파라미터 스토어 - 파라미터 생성 클릭
2. 프리티어라 표준 클릭 - 문자열은 위에서 설명한 구성 데이터 값을 의미(원하면 값 목록 데이터로 바꾸어도 된다.)

+) 그 밑에 보안 문자열이 있는데 파라미터 스토어에서 뭔가를 암호화하려고 할 때 쓴다.

=>  API 키나 비밀번호 등을 추가할 수 있기 때문

만들고 나면 아까 만들 때 Text 칸에 넣어줬던 값이 있는데 필자는 hi를 넣었고 만들어진 값 칸에 그대로 들어가있는 것을 확인할 수 있다.

 

✅짤막한 개념 정리

프로비저닝할 인프라 없이 Docker 컨테이너를 시작하는 서버리스 서비스를 원할 때?

-> Fargate를 사용하면 AWS에서 Docker 컨테이너를 시작할 수 있으며 인프라를 프로비저닝 및 유지 관리할 필요가 없다. (=관리할 EC2 인스턴스 없음)

Docker는 실행 위치에 관계없이 동일한 방식으로 애플리케이션을 실행할 수 있는 소프트웨어 개발 플랫폼이다. 몇 초 안에 컨테이너를 확장 및 축소할 수 있다.

회사는 수천 개의 작업을 실행해야 하지만 컴퓨팅 리소스를 관리, AWS Batch를 사용하면 개발자, 과학자 및 엔지니어가 AWS에서 수십만 개의 배치 컴퓨팅 작업을 쉽고 효율적으로 실행할 수 있다.

AWS Batch는 제출된 배치 작업의 볼륨 및 특정 리소스 요구 사항을 기반으로 최적의 수량 및 유형의 컴퓨팅 리소스(예: CPU 또는 메모리 최적화 인스턴스)를 동적으로 프로비저닝한다.