Architecture
아키텍처 설명
Client 입장
1. Client는 Domain으로 Browser로 접근합니다.
2. Client의 요청을 받은 ALB는 Django로 운영 중인 웹 서버에 Round Robin 알고리즘 방식으로 Web Server에 요청을 보냅니다.
3. ALB의 Request를 받은 Web Server는 해당 내용에 대해 Client의 브라우저에 출력될 수 있도록 Web Content를반환해줍니다.
Developer 입장
1. 개발자가 Playbook을 작성하여 Python3/Boto3로 개발된 애플리케이션에 업로드를 합니다.
2. 해당 Playbook을 받은 Boto3 애플리케이션은 S3 Bucket에 업로드를 합니다.
3. S3에 업로드가 정상 적으로 되면 Event를 발생하여 Lambda에게 정보가 전달됩니다.
4. 전달을 받은 Lambda다는 Control Plane에 Playbook을 전송해주고 적용을 하는 명령어를 System Manager에서 지원하는 Run Command를 사용해 명령어를 전송 및 실행시킵니다.
5. 만약 부하가 발생하여 Auto Scaling를 통해 Instance가 자동으로 확장이 됩니다.
6. 이때 확장이 된 Instance에는 아무런 웹 파일이 존재하지 않기 때문에 Auto Scaling Event를 통해서 확장이 되었을 경우 Lambda 함수가 동작합니다.
1. 해당 Lambda Function은 새롭게 추가된 Instance의 Id를 parsing하여 새롭게 추가된 Instance에게 Playbook을 Apply하도록 함수를 수행합니다.
Hands on Lab
Create VPC using CloudFormation Stack
우선 CloudFormation을 사용해서 VPC를 구성해주자.
$ aws cloudformation create-stack --stack-name ioc-vpc-stack --template-body file://vpc.yml --region ap-northeast-2 |
그러면 약 5분 뒤에 VPC가 모두 생성되었는지 확인하고 진행.
Create S3 Buckets
이제 S3 Bucket을 AWS CLI를 사용해서 Bucket을 생성해주자.
$ aws s3 mb s3://ioc-ansible-bucket --region ap-northeast-2 |
Create IAM Role
https://console.aws.amazon.com/iam
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ssm:SendCommand", "lambda:UpdateFunctionConfiguration" ], "Resource": [ "arn:aws:lambda:ap-northeast-2:XXXXXXXXXXXX:function:ioc-send-playbook-functions", "arn:aws:ssm:*:*:document/*" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "ssm:SendCommand", "Resource": "arn:aws:ec2:*:*:instance/*" } ] } |
그리고 policy를 생성해주고 해당 Policy를 Attach 해준다
그리고 해당 Role을 생성해준다.
Lambda 전용 IAM Role을 생성해주었다면 이제 EC2 Instance를 위한 IAM Role을 하나 생성해주자.
그리고 해당 Role을 생성해주자.
Create Security Group
아래와 같은 Rule을 갖는 Security Group을 생성해준다.
Create Auto Scaling groups
https://console.aws.amazon.com/ec2
그리고 launch template을 생성해주고 이제 Auto Scaling Group을 생성해주자.
Private Subnet을 모두 선택해준다.
Create Lambda Function
이제 Lambda Function을 생성해주자.
https://console.aws.amazon.com/lambda
그리고 Lambda 함수를 생성해주고 배포된 파일을 업로드해준다.
//해당 코드는 ioc-send-playbook-functions 폴더안에 lambda_function.py파일의 Source Code를 작성해주면 된다.
그리고 이제 SNS를 사용해서 Event Trigger를 구성해주자.
https://console.aws.amazon.com/sns
{ "Version": "2008-10-17", "Id": "example-ID", "Statement": [ { "Sid": "s3-publish-access", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:ap-northeast-2:XXXXXXXXXXXX:ioc-lifecycle-notification" } ] } |
그리고 생성해준다.
생성을 했다면 이제 lambda랑 연결해주자.
그리고 이제는 S3랑도 연결을 해주자.
https://console.aws.amazon.com/s3/
Create Notification Service
Auto Scaling Group이 Scale-out 했을 경우 알람이 가도록 구성해주자
https://console.aws.amazon.com/ec2
그리고 생성해준다.
Create Application Load Balancer
우선 ALB를 생성하기 앞서 Target Group을 생성해주자.
그리고 생성해주고 이제 Auto Scaling Group에 Attach 해주자.
그리고 이제 Load Balancer를 생성해주자.
그리고 Load Balancer를 생성해준다.
Deploying Apache Applications
그리고 이제 배포를 해보자
$ Scripts/python app.py --file playbook.yml --bucket ioc-ansible-bucket --region ap-northeast-2 |
그리고 ALB를 통해서 접근하면 아래와 같이 정상 적으로 접근이 되는 것을 볼 수 있다.
'Cloud Computing > Amazon Web Service' 카테고리의 다른 글
[Amazon Web Services] 인코딩 되어있는 에러메시지 디코딩해서 보기(Encoded authorization failure message) (0) | 2022.06.29 |
---|---|
[Amazon Web Services] AWS STS(Security Token Service)를 사용해보자 ! (0) | 2022.06.28 |
댓글