본문 바로가기
카테고리 없음

인프라 파이프라인 구축

by ^..^v 2022. 3. 17.
728x90
반응형

1. IaC(Infrastructure as Code) 환경 설정

1.1. git 설치 및 확인

https://git-scm.com/downloads

c:\msur> git --version
git version 2.35.1.windows.2

 

1.2. 테라폼 설치 및 확인

https://www.terraform.io/downloads

c:\msur> terraform version
Terraform v1.1.6
on windows_386

 

2. AWS 웹 서비스 구성

운영에 사용할 운영 계정을 생성하고, 필요한 권한을 부여

 

2.1. AWS 운영 계정 설정

IAM 페이지에서 사용자를 추가

 

사용자 이름으로 "할당받은계정-ops-account"를 입력

 

계정에 IAMFullAccess 정책을 연결

 

사용자 보안 자격 증명을 다운로드

 

2.2. AWS CLI 구성

생성자한 사용자 계정으로 AWS CLI를 사용할 수 있도록 aws configure 명령으로 AWS 구성 정보를 설정

C:\> mkdir msur

C:\> cd msur

C:\msur> aws configure
AWS Access Key ID [****************ELZ3]: AKIAU**********VVN4N
AWS Secret Access Key [****************G/aL]: ns41Lxg+********************lAxGD4cJpgHo
Default region name [us-west-2]: us-west-2		⇐ 할당받은 계정에 지정된 리전
Default output format [json]: json

C:\msur> aws iam list-users				⇐ AWS CLI를 이용한 사용자 조회
{
    "Users": [
        {
            "Path": "/",
            "UserName": "sk403-003",			⇐ 할당 받은 계정
            "UserId": "AIDAUFTZFRUTYBO5DJ3JU",
            "Arn": "arn:aws:iam::286943186215:user/sk403-003",
            "CreateDate": "2022-01-24T07:07:05+00:00",
            "PasswordLastUsed": "2022-03-11T05:18:28+00:00"
        },
        {
            "Path": "/",
            "UserName": "sk403-003-ops-account",	⇐ 생성한 계정
            "UserId": "AIDAUFTZFRUT6ST6M7DEN",
            "Arn": "arn:aws:iam::286943186215:user/sk403-003-ops-account",
            "CreateDate": "2022-03-11T05:22:25+00:00"
        },
		… (생략) …         
    ]
}

 

2.3. AWS 운영 권한 설정

인프라를 구성할 때 필요한 권한을 일관되게 설정, 관리할 수 있도록 사용자 그룹을 생성하고 해당 그룹에 권한을 부여

그룹 생성 및 확인
C:\msur> aws iam create-group --group-name sk403-003-ops-accounts
{
    "Group": {
        "Path": "/",
        "GroupName": "sk403-003-ops-accounts",
        "GroupId": "AGPAUFTZFRUT6VSJHDQDS",
        "Arn": "arn:aws:iam::286943186215:group/sk403-003-ops-accounts",
        "CreateDate": "2022-03-11T05:33:12+00:00"
    }
}

C:\msur> aws iam list-groups
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "sk403-003-ops-accounts",
            "GroupId": "AGPAUFTZFRUT6VSJHDQDS",
            "Arn": "arn:aws:iam::286943186215:group/sk403-003-ops-accounts",
            "CreateDate": "2022-03-11T05:33:12+00:00"
        },
		… (생략) … 
    ]
}


그룹에 사용자 추가 및 확인
C:\msur> aws iam add-user-to-group --user-name sk403-003-ops-account --group-name sk403-003-ops-accounts

C:\msur> aws iam get-group --group-name sk403-003-ops-accounts
{
    "Users": [
        {
            "Path": "/",
            "UserName": "sk403-003-ops-account",
            "UserId": "AIDAUFTZFRUT6ST6M7DEN",
            "Arn": "arn:aws:iam::286943186215:user/sk403-003-ops-account",
            "CreateDate": "2022-03-11T05:22:25+00:00"
        }
    ],
    "Group": {
        "Path": "/",
        "GroupName": "sk403-003-ops-accounts",
        "GroupId": "AGPAUFTZFRUT6VSJHDQDS",
        "Arn": "arn:aws:iam::286943186215:group/sk403-003-ops-accounts",
        "CreateDate": "2022-03-11T05:33:12+00:00"
    }
}


권한 정책을 그룹에 연결
c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::aws:policy/IAMFullAccess
c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess
c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess
c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::aws:policy/AmazonEKSServicePolicy
c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess
c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess
c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess


EKS 사용에 필요한 권한 정책을 사용자 지정 정책으로 정의해서 그룹에 연결
C:\msur\custom-eks-policy.json					⇐ EKS를 위한 사용자 지정 정책 파일을 생성
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "eks:DescribeNodegroup",
        "eks:DeleteNodegroup",
        "eks:ListClusters",
        "eks:CreateCluster"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "eks:*",
      "Resource": "arn:aws:eks:*:*:cluster/*"
    }
  ]
}


c:\msur> aws iam create-policy --policy-name sk403-003-EKS-Management --policy-document file://custom-eks-policy.json					⇐ 정책 파일을 이용해 새로운 정책을 생성
{
    "Policy": {
        "PolicyName": "sk403-003-EKS-Management",
        "PolicyId": "ANPAUFTZFRUTUCBMNT4NZ",
        "Arn": "arn:aws:iam::286943186215:policy/sk403-003-EKS-Management",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2022-03-11T05:48:50+00:00",
        "UpdateDate": "2022-03-11T05:48:50+00:00"
    }
}

c:\msur> aws iam attach-group-policy --group-name sk403-003-ops-accounts --policy-arn arn:aws:iam::286943186215:policy/sk403-003-EKS-Management		⇐ 사용자 지정 정책을 그룹에 연결

 

AWS Management Console을 통해 사용자 그룹에 권한 정책 연결 확인

 

2.4 테라폼 상태 파일을 저장할 S3 버킷 생성

인프라 환경의 상태와 마지막으로 어떤 작업을 수행했는지를 기록한 JSON 기반의 테라폼 상태 파일을 저장할 버킷을 생성

https://docs.aws.amazon.com/cli/latest/reference/s3api/create-bucket.html

 

CASE1. 할당받은 계정의 리전이 버지니아 북부(us-east-1)인 경우
c:\msur> aws s3api create-bucket --bucket sk403-003-bucket --region us-west-1

CASE2. 할당받은 계정의 리전이 버지니아 북부(us-east-1)가 아닌 경우
c:\msur> aws s3api create-bucket --bucket sk403-003-bucket --region us-west-2 --create-bucket-configuration LocationConstraint=us-west-2
{
    "Location": "http://sk403-003-bucket.s3.amazonaws.com/"
}

 

3 IaC 파이프라인 구축

3.1. 샌드박스 저장소 생성 

Iac 모듈과 파이프라인을 시험해 보는 테스트 환경의 코드와 파이프라인 설정을 저장할 깃허브 저장소를 생성

 

env-sandbox 깃허브 저장소 생성

새 레포지토리 생성



env-sandbox 이름의 사설 레포지토리를 생성

 

git clone 명령어로 생성한 레포지토리를 로컬 레포지토리로 복제

로컬 레포지토리 생성
C:\msur> git clone https://github.com/naanjini/env-snadbox.git
Cloning into 'env-snadbox'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.

 

3.2. 샌드박스 환경 테라폼 코드 작성 및 테스트

C:\msur\env-sandbox\main.tf 

terraform {                              # 테라폼의 백엔드 상태를 저장하기 위해 S3 버킷을 사용
    backend "s3" {                       # https://www.terraform.io/language/settings/backends/configuration 
        bucket = "sk403-003-bucket"      # S3 버킷 이름
        key    = "terraform/backend"
        region = "us-west-2"             # 할당받은 계정의 리전
    }    
}

locals {                                 # 지역 변수의 집합을 정의
    env_name         = "sandbox"         # https://www.terraform.io/language/values/locals 
    aws_region       = "us-west-2"       # 할당받은 계정의 리전
    vpc_name         = "sk403-003-vpc"   
    k8s_cluster_name = "sk403-003-ms-cluster"     
}

# TODO AWS 네트워크 구성

# TODO EKS 클러스터 구성

# TODO GitOps 구성

 

코드 형식 지정

c:\msur\env-sandbox> terraform fmt main.tf

 

작업 디렉터리 초기화

초기 파일 생성, 원격 상태 로드, 모듈 다운로드 등을 통해 신규 또는 기존 테라폼 작업 디렉토리를 초기화

c:\msur\env-sandbox> terraform init

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

 

구성 검사

원격 상태, 공급자 API 등과 같은 원격 서비스에 액세스하지 않고 디렉터리의 구성 파일을 확인

c:\msur\env-sandbox> terraform validate
Success! The configuration is valid.

 

실행 계획 확인

현재 구성을 적용하기 위한 실행 계획(모의 테스트, dry run)을 생성

c:\msur\env-sandbox> terraform plan

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

 

3.3 테라폼 파일을 깃허브 저장소에 추가

C:\msur\env-snadbox> git add .

C:\msur\env-snadbox> git commit -m "샌드박스 구성 파일 생성"
[main 2a0ad92] 샌드박스 구성 파일 생성
 1 file changed, 19 insertions(+)
 create mode 100644 main.tf

C:\msur\env-snadbox> git push origin
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 753 bytes | 376.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/naanjini/env-snadbox.git
   91cd688..2a0ad92  main -> main

 

3.4 CI/CD 파이프라인 구축

깃허브에서 제공하는 데브옵스 도구인 깃허브 액션을 사용해 테라폼 파일을 자동으로 적용하는 CI/CD 파이프라인을 설정

시크릿 설정 - AWS 액세스 키 아이디와 시크릿 액세스 키를 등록

깃허브 액션의 시크릿 설정

 

AWS 운영 계정의 자격증명 정보를 등록

 

깃허브 액션 워크플로 생성

워크플로는 파이프라인이 트리거될 때마다 실행하는 일련의 단계를 의미

깃허브 액션 워크플로

 

워크플로 생성

 

워크플로 생성

 

워크플로 트리거와 작업 설정

name: Sandbox Environment Build

# 워크플로 트리거와 작업 설정
on:                                                      # 워크플로의 트리거를 지정하는 깃허브 액션 명령
  create:                                                # v* 패턴과 일치하는 새 태그가 생성될 때마다 실행 
    tags: 
      - v*                      
jobs:                                                    # 트리거될 때 마다 수행해야 하는 작업 모음 
  build:                                                 # 작업은 서버 또는 컨테이너에서 실행
    runs-on: ubuntu-latest                               # 작업 머신 실행
    env:                                                 # 작업에 필요한 설정 정보  
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    steps:                                               # 워크플로가 설정한 환경에서 수행할 특정 워크플로 단계
    - uses: actions/checkout@v2   
    #       ~~~~~~~ ~~~~~~~~~~~
    #        |       |
    #        |       +--- 깃에서 코드 사본을 가져 옮 (https://github.com/actions/checkout)
    #        +----------- 깃허브 액션 워크플로에서 호출할 수 있는 모듈화된 코드 라이브러리
                                             
    # TODO 종속성 설치

 

종속성 설치

           … (생략) … 
        
    # 종속성 설치 - 빌드 환경에서 필요로 하는 도구 설치 (예: Git, AWS CLI, Terraform CLI, AWS 구성 등)   
    # aws-iam-authenticator (AWS IAM Authenticator for Kubernetes)
    #   - AWS IAM 자격 증명을 사용하여 쿠버네티스 클러스터에 인증하는 도구 
    #   - AWS 인증자(authenticator)는 다른 도구에서 AWS 환경을 인증하고 접속하는 데 사용할 수 있는 명령줄 도구
    #   - https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-aws-iam-authenticator.html    
    - name: Install aws-iam-authenticator
      run: |
        echo Installing aws-iam-authenticator
        mkdir ~/aws
        curl -o ~/aws/aws-iam-authenticator \
        https://amazon-eks.s3.us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/aws-iam-authenticator
        chmod +x ~/aws/aws-iam-authenticator
        sudo cp ~/aws/aws-iam-authenticator /usr/local/bin/aws-iam-authenticator    
    
    # TODO 테라폼 파일 적용

 

테라폼 파일 적용

           … (생략) … 
   
    # 테라폼 파일 적용
    - uses: hashicorp/setup-terraform@v1
      with:
        terraform_version: 1.1.6
        
    - name: Terraform fmt
      run: terraform fmt
    
    - name: Terraform Init
      run: terraform init
    
    - name: Terraform Validate
      run: terraform validate -no-color
    
    - name: Terraform Plan
      run: terraform plan -no-color
    
    - name: Terraform Apply
      run: terraform apply -no-color -auto-approve
      
    # TODO 파일 게시

 

파일 게시

           … (생략) … 
      
    # 파일 게시
    - name: Upload kubeconfig file
      uses: actions/upload-artifact@v2            # 빌드에 사용한 가상머신의 상태, 파일, 결과의 일부를 
      with:                                       # 깃허브 액션 워크플로 완료 이후에도 사용할 수 있도록 보관
        name: kubeconfig                          #  kubeconfig 파일을 깃허브 액션 저장소로 업로드
        path: kubeconfig

 

깃허브 액션 워크플로 커밋



파이프라인 테스트

정의한 작업에 대한 트리거를 실행 → v로 시작하는 레이블을 사용하여 깃 태그를 생성

c:\msur\env-sandbox> git pull					⇐ git pull
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), 1.53 KiB | 68.00 KiB/s, done.
From https://github.com/naanjini/env-snadbox
   2a0ad92..7bf61aa  main       -> origin/main
Updating 2a0ad92..7bf61aa
Fast-forward
 .github/workflows/main.yml | 54 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100644 .github/workflows/main.yml


C:\msur\env-snadbox> git tag -a v0.1 -m "워크플로 테스트"		⇐ git tag

C:\msur\env-snadbox> git push origin v0.1				⇐ git push
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 181 bytes | 181.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/naanjini/env-snadbox.git
 * [new tag]         v0.1 -> v0.1

 

 

728x90
반응형

댓글