Study/seSAC 금천 4기

클라우드_4일차_241008

지찬씌 2024. 10. 15. 09:12

AWS CLI 를 이용한 VPC, EC2 생성

 

 

1. IAM 사용자를 생성 (루트 계정으로 Management Console에 접속해서 생성)

 

- CLI를 이용하여 control 할 것이기 때문에, managemnet console 접속 권한을 주지 않는다.

 

 

 

 

- 새로 생성한 사용자의 AccessKey 생성

 

 

 

- AWS CLI에 사용자 정보를 등록

 

  > aws configure

 

 

 

- VPC 정보를 조회

 

  > aws ec2 describe-vpcs

 

 

 

- 사용자 정보를 조회

 

  > aws iam get-user

 

 

 

 

 

2. VPC 생성

https://docs.aws.amazon.com/cli/latest/reference/ec2/create-vpc.html

 

- VPC 생성 명령어

 

  > aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specification "ResourceType=vpc, Tags=[{Key=Name, Value=MyVPC}]" --output json

 

 

 

- VPC 생성 확인 (VPC 생성 시 출력된 내용과 같은지 확인)

 

  > aws ec2 describe-vpcs

 

 

 

- VPC 내용에서 특정 내용만 가져오는 명령어

 

  > 

    배열에 astrick(*)을 사용해도 동일하게 가져올 수 있다.

  > 

 

 

 

- VPC ID를 환경변수로 설정 및 확인

 

  > 

 

  > 

 

 

 

 

3. 인터넷 게이트웨이를 생성 후 VPC에 연결

https://docs.aws.amazon.com/cli/latest/reference/ec2/create-internet-gateway.html

 

- 인터넷 게이트웨이 생성

 

  > 

 

 

 

- 환경 변수에 인터넷 게이트웨이 ID를 등록

 

 > 

 

 

 

- 인터넷 게이트웨이에 VPC 연결 (=VPC ID와 게이트웨이 ID 필수)

 

  > 

 

 

 

- AWS Management Console에서 확인

 

 

 

 

4. Subnet 생성

https://docs.aws.amazon.com/cli/latest/reference/ec2/create-subnet.html

 

- PublicSubnetA라는 이름의 서브넷 생성 (cidr-block 범위, 가용영역, 이름을 붙여주기 위한 tag-specification 필요)

 

  > 

 

 

- PublicSubnetC라는 이름의 서브넷 생성

 

  >

 

 

 

- 퍼블릭 서브넷 ID를 환경변수로 설정 및 조회

 

  1) PublicSubnetA

  > 

 

  > 

 

  2) PublicSubnetC 

  > 

 

  > 

 

 

 

 

 

 

5. 퍼블릭 서브넷 설정

 

- 퍼블릭 라우팅 테이블 생성

https://docs.aws.amazon.com/cli/latest/reference/ec2/create-route-table.html

 

  > 

 

 

 

- 라우팅 테이블 ID를 환경변수로 설정

 

  > 

 

 

 

- 라우팅 테이블에 인터넷 게이트웨이로의 라우팅 정보를 추가 및 확인

 

  > 

 

  >

 

 

 

- 퍼블릿 서브넷에 퍼블릭 라우팅 테이블을 연결

https://docs.aws.amazon.com/cli/latest/reference/ec2/associate-route-table.html

 

  > 

 

  >

 

 

 

 

- 퍼블릭 서브넷에 퍼블릭 IP를 자동으로 할당되도록 설정

https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-subnet-attribute.html

 

  1) 필요한 정보 추출

  > aws ec2 describe-subnets

 

  > aws ec2 describe-subnets --query "Subnets[*].{SubnetId:SubnetId,CidrBlock:CidrBlock,MapPublicIpOnLaunch:MapPublicIpOnLaunch}"

 

 

 

  2) 퍼블릭 IP 자동할당 옵션(MapPublicIpOnLaunch) true로 변경

  > 

 

  > 

 

 

  3) 옵션(MapPublicIpOnLaunch) 변경 확인

  > 

 

 

 

 

6. VPC DNS 호스트 이름을 활성화

https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-vpc-attribute.html

 

  > 

 

 

 

 

 

 

 

* 프라이빗 서브넷 생성

1. 개요

이름 가용영역 CIDR
PrivateSubnetA 가용영역A 10.0.20.0/24
PrivateSubnetC 가용영역C 10.0.40.0/24

 

 

 

 

2. 서브넷 생성 및 조회

 

 

 

 

3. 서브넷 ID 환경변수로 설정

 

 

 

 

4. 라우팅 테이블 생성

 

 

 

 

5. 라우팅 테이블 조회

 

 

 

 

6. 라우팅 테이블 ID 환경변수로 설정

 

 

 

 

7. 서브넷과 라우팅 테이블 연결

 

 

 

 

8. Management Console에서 조회

 

 

 

 

 

7. 키 페어 생성

https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html

 

  > 

 

 

 

 

 

8. 보안 그룹

https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html

 

- 보안 그룹 생성 및 생성된 보안 그룹의 ID를 환경변수로 설정

 

  > 

 

  >

 

 

 

- 보안 그룹에 인바운드 규칙 추가

https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html

 

  > 

 

 

 

 

 

9. EC2 인스턴스 생성

 

- 인스턴스 생성 시 사용할 사용자 데이터(인스턴스 생성 시 시작할 프로그램)를 담고 있는 텍스트 파일 생성

 

  > notepad user_data.txt

    메모장에 아래 코드 입력하고 저장 후 종료

#!/bin/bash

yum install -y httpd
systemctl enable --now httpd
echo "<h1>Hello AWS CLI</h1>" > /var/www/html/index.html

 

 

 

- 인스턴스 생성에 사용할 이미지 ID 확인 (ami-0e18fe6ecdad223e5)

 

 

 

- 인스턴스 생성

https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html

 

  > aws ec2 run-instances --image-id ami-0e18fe6ecdad223e5 --count 1 --instance-type t2.micro --key-name AWS_CLI_KEY --security-group-id %MYWEBSERVERSG% --subnet-id %PublicSubnetA_ID% --user-data file://user_data.txt --tag-sepcification "ResourceType=instance, Tags=[{Key=Name, Value=MyWebServer}]"

 

 

 

- 인스턴스 ID 를 환경변수로 설정

 

  > 

 

 

 

- 인스턴스의 퍼블릭 주소 확인 및 요청

 

  > 

 

 

 

 

 

- 인스턴스로 SSH 접속

 

  > 

 

 

 

 

10. 리소스 정리

 

- 인스턴스 종료

https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html

 

 

 

- 보안그룹 삭제

https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html

 

 

 

- 서브넷 삭제

https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-subnet.html

 

 

 

- 인터넷 게이트웨이를 VPC로부터 분리

https://docs.aws.amazon.com/cli/latest/reference/ec2/detach-internet-gateway.html

 

 

 

- 인터넷 게이트웨이 삭제

https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-internet-gateway.html

 

 

 

- 퍼블릭 라우팅 테이블 삭제

https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-route-table.html

 

 

 

- 프라이빗 라우팅 테이블은 기본라우팅 테이블을 사용했으므로 삭제 불가 (새로 만들었다면 삭제)

 

 

 

- 키페어 삭제

https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html

 

 

 

- VPC 삭제

https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-vpc.html

 

 

 

- EC2 인스턴스가 삭제된 것을 확인

 

 

 

 

 

- VPC 리소스가 모두 삭제되었는지 확인'

 

 

 

 

 

 

 

 

AWS 환경에서 LoadBalancer 타입의 서비스를 연동

 

실습 진행을 위해 먼저 가상머신 실행

 

 

 

1. IAM 사용자 생성 및 시크릿 키 생성

 

 

 

 

 

2. 작업머신 (vagrant로 생성한 controlplane 가상머신)에 사용자 정보 등록

    및 kOps를 이용해 클러스터 구성

 

- 작업 머신에 aws 명령어 사용을 위한 awscli를 설치한다.

 

 

- 생성한 사용자 정보를 등록한다.

 

 

 

- 최신 버전의 kOps 다운로드

https://kubernetes.io/ko/docs/setup/production-environment/tools/kops/

 

  > curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64

 

 

 

 

- kOps 바이너리에 실행 속성을 부여

 

  > 

 

  > 

 

  >

 

 

 

- kops 바이너리를 사용자 PATH로 이동

 

  > 

   => 이 설정을 통해 kops-linux-amd64 명령어를 줄여서 kops만으로 사용할 수 있다.

 

 

 

 

 

 

 

3. 클러스터 상태를 저장할 S3 버킷을 생성

 

- S3 버킷 생성

 

  > 

 

 

- S3 버킷에 버저닝(Versioning) 활성화

 

  > 

 

 

 

- 쿠버네티스 클러스터 이름과 S3 버킷 이름을 환경변수로 설정

 

  >

 

  >

 

  >

 

  >

 

 

 

 

 

4. 쿠버네티스를 설치할 EC2 인스턴스에 배포할 SSH 키를 생성

 

- SSH 키 생성

 

  > 

 

 

- SSH 키 확인

 

  > 

 

 

 

 

 

5. 클러스터 설정 구성

 

  > kops create cluster --zones ap-northeast-2a --networking calico --ssh-public-key ./id_rsa.pub $NAME

:

:

Must specify --yes to apply changes

 

Cluster configuration has been created.

 

Suggestions:

 * list clusters with: kops get cluster

 * edit this cluster with: kops edit cluster mycluster.k8s.local

 * edit your node instance group: kops edit ig --name=mycluster.k8s.local nodes-ap-northeast-2a

 * edit your control-plane instance group: kops edit ig --name=mycluster.k8s.local control-plane-ap-northeast-2a


Finally configure your cluster with: kops update cluster --name mycluster.k8s.local --yes --admin

 

   => 클러스터 생성 후 어떻게 설정하는 것인지 마지막에 알려준다.

 

 

 

 

- 3개의 워커 노드를 생성하도록 설정

 

  > 

 

 

 

- 클러스터 생성 (약 15분 정도 소요)

 

  > kops update cluster --name mycluster.k8s.local --yes --admin

:

:

kOps has set your kubectl context to mycluster.k8s.local

 

Cluster is starting.  It should be ready in a few minutes.

 

Suggestions:

 * validate cluster: kops validate cluster --wait 10m

 * list nodes: kubectl get nodes --show-labels

 * ssh to a control-plane node: ssh -i ~/.ssh/id_rsa ubuntu@

 * the ubuntu user is specific to Ubuntu. If not using Ubuntu please use the appropriate user based on your OS.

 * read about installing addons at: https://kops.sigs.k8s.io/addons.

 

 

 

 

 

 

 

 

 

 

6. Deployment 및  LoadBalancer 타입의 서비스를 생성

 

- Deploymnet 생성

 

   => 기존 실습에서 사용한 hostname-deployment.yaml 파일을 사용한다.

 

  > cat hostname-deployment.yaml (yaml 파일 조회)

 

  > kubectl apply -f hostname-deployment.yaml

 

 

 

 

- LoadBalancer 타입의 서비스 생성

 

  => 기존의 hostname-service-nodeport.yaml의 type을 loadbalancer로 바꾼 뒤 서비스 생성

 

  > kubectl apply -f hostname-service-loadbalancer.yaml

 

 

 

7. 생성된 LoadBalancer 타입의 EXTERNAL IP로 요청

 

  > 

 

  > 

 

  > 

 

- EXTERNAL IP(동적으로 생성된 로드밸런서의 DNS 주소와 동일)로 요청을 전달하면 3개의 파드가 돌아가면서 응답을 제공하는 것을 확인할 수 있다. 

 

 

 

 

 

 

 

 

8. 리소스 정리

 

- kOps 명령어를 이용해 생성한 쿠버네티스 클러스터는 kOps 명령어를 이요해 일괄적으로 사용할 수 있다.

 

  > kops delete cluster $NAME --yes

 

 

 

 

- 버킷 삭제

 

 

 

 

- Management Console의 EC2에서 인스턴스 등의 삭제 확인

 

 

 

 

 

 

AWS Cloudformation

: AWS 리소스를 모델링하고 설정하여 서비스 관리 시간을 줄이고 AWS에서 실행되는 앱에 더 많은 시간을 사용할 수 있도록 돕는 서비스이다. (=앱 개발에 집중 할 수 있게 지원)

https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/Welcome.html

 

 

 

 

1. AWS Cloudformation 작동 방식

 

  1) YAML 또는 JSON 포맷으로 Cloudformation 탬플릿을 작성하거나, 샘플 탬플릿을 사용하여 인프라를 코드로 작성한다.

 

  2) 로컬의 템플릿 코드를 체크아웃 하거나, S3 버킷에 템플릿을 업로드한다.

 

  3) AWS 콘솔, CLI 또는 API를 통해 AWS Cloudformation을 사용하여 템플릿 코드를 기반으로 스택(stack)을 생성한다. 

 

  4) 템플릿에 지정된 스택(stack)을 통해 AWS 리소스에 대한 프로비저닝 및 구성 작업을 쉽게 수행할 수 있다.

      (stack 생성에 실패하면, AWS Cloudformation에서는 생성한 리소스를 삭제하여 변경 사항을 롤백한다.

 

 

 

 

 

2. AWS Cloudformation 구성 요소

https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html

 

- AWS Cloudformation을 사용하는 경우에는 템플릿 및 스택으로 작업한다.

  템플릿을 생성하여 AWS 리소스와 해당 속성에 대해 설명하고,

  스택을 생성할 때마다 Cloudformation에서 템플릿에 설명된 리소스를 프로비저닝한다.

 

 

 

- 탬플릿

 

  > JSON 또는 YAML 형식의 텍스트 파일

  > 스택에서 프로비저닝할 리소스를 설명

  > Cloudformation Designer 또는 텍스트 편집기를 사용해 생성 가능하다.

  > 템플릿의 구조 :

      https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/template-anatomy.html 참조

 

 

 

- 스택

 

  > 하나의 단위로 관리할 수 있는 AWS 리소스 모음

  > 스택의 생성, 수정, 삭제를 통해 리소스 모음의 생성, 수정, 삭제 가능

  > 스택의 모든 리소스는 Cloudformation 템플릿을 통해 정의된다.

  > 스택을 삭제하면 관련 리소스가 모두 삭제된다.

 

 

 

- 변경 세트

 

 

 

 

 

 

 

AWS Cloudformation을 활용한 네트워크 생성

 

1. 템플릿 생성

 

- CreateVPC_01.yaml 파일 작성

 

AWSTemplateFormatVersion: "2010-09-09"

 

Description: Make a VPC

 

Resources:

  MyVPC:

    Type: AWS::EC2::VPC

    Properties:

      CidrBlock: 10.0.0.0/16

      EnableDnsHostnames: true

 

  MyIGW:

    Type: AWS::EC2::InternetGateway

 

  MyVPCGatewayAttachment:

    Type: AWS::EC2::VPCGatewayAttachment

    Properties:

      InternetGatewayId: !Ref MyIGW

      # VpcId: !Ref MyVPC

      VpcId:

        Ref: MyVPC

 

  MyPublicSubnetA:

    Type: AWS::EC2::Subnet

    Properties:

      VpcId: !Ref MyVPC

      CidrBlock: 10.0.10.0/24

      AvailabilityZone: !Select                       <= 다음 코드의 내용을 가져오는 명령어

        - '0'                                                      <= 그 알파벳 순서에서 0번째(=1번)을 가져온다.

        - !GetAZs ''                                          <= 가용영역의 순서가 알파벳 순서로 정렬되는데,

     

  MyPrivateSubnetA:

    Type: AWS::EC2::Subnet

    Properties:

      VpcId: !Ref MyVPC

      CidrBlock: 10.0.20.0/24

      AvailabilityZone: !Select

        - '0'

        - !GetAZs ''

 

  MyPublicRT:

    Type: AWS::EC2::RouteTable

    Properties:

      VpcId: !Ref MyVPC

 

  MyPublicRoute:

    Type: AWS::EC2::Route

    Properties:

      DestinationCidrBlock: 0.0.0.0/0

      GatewayId: !Ref MyIGW

      RouteTableId: !Ref MyPublicRT

 

  MyPublicSubnetRTAssociationA:

    Type: AWS::EC2::SubnetRouteTableAssociation

    Properties:

      SubnetId: !Ref MyPublicSubnetA

      RouteTableId: !Ref MyPublicRT

 

  MyPrivateRT:

    Type: AWS::EC2::RouteTable

    Properties:

      VpcId: !Ref MyVPC

 

  MyPrivateSubnetRTAssociationA:

    Type: AWS::EC2::SubnetRouteTableAssociation

    Properties:

      SubnetId: !Ref MyPrivateSubnetA

      RouteTableId: !Ref MyPrivateRT

 

Outputs:

  VPC:

    Description: MyVPC's VPC ID

    Value: !Ref MyVPC

  AZa:

    Description: Availability Zone a

    Value: !GetAtt

      - MyPublicSubnetA

      - AvailabilityZone

 

 

- 내장함수

https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

 

  > 기본적으로 service-provider::service-name::data-type-name 의 형식을 가진다.

 

 

- 리소스 및 속성 유형

https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html

 

 

 

 

2. 스택 생성

 

 

- 출력 확인 : 템플릿에서 outputs 항목에 정의한 내용이 출력되는지 확인

 

 

 

 

- 리소스 생성 확인

 

  1) VPC 생성 확인

     : IPv4 CIDR, DNS 호스트 이름 항목이 템플릿에서 정의한 것과 일치하는지 확인

 

  2) 인터넷 게이트웨이 생성 확인

     : VPC와 연결되어 있는지 확인

 

  3) 서브넷 생성 확인

     : VPC, IPv4 CIDR, 가용영역, 라우팅 테이블 확인

 

  4) 퍼블릭 라우팅 테이블 확인

     : 인터넷 게이트웨이로의 라우팅이 포함되어 있는지 확인

 

  5) 프라이빗 라우팅 테이블 확인

     : local 라우팅만 포함되어 있는지 확인

 

 

 

 

 

 

 

3. 리소스 정리

    => 스택 삭제 (why? 스택으로 생성된 리소스는 스택을 삭제 시 관련된 리소스가 자동으로 삭제된다.)

    => 단, 버킷은 별도로 삭제 (why? 버킷에는 템플릿이 저장되어 있어 버킷 내부 객체부터 삭제)

 

 

 

 

 


context?ㄷ

'Study > seSAC 금천 4기' 카테고리의 다른 글

DevOps/Scrum 특강_241024~241025  (1) 2024.10.25
이노그리드 CI/CD 특강_241022  (0) 2024.10.23
클라우드_5일차_241010  (0) 2024.10.14
클라우드_3일차_241007  (1) 2024.10.11
클라우드_2일차_241002  (0) 2024.10.10