글 목록으로

2024년 지방기능경기대회 클라우드컴퓨팅 1과제

AWS CloudFormation을 이용한 전체 자동 설정

April Fool's Day 🤪

실제 방법을 다루지 않습니다, 특정 검색어가 구글 검색에 의해 얼마나 유입되는지 실험하기 위해 작성하였습니다.


AWSTemplateFormatVersion: 2010-09-09
Resources:
  # empty resource stack
  EmptyResource:
    Type: "AWS::CloudFormation::Stack"
    Properties:
      TemplateURL: "https://s3.amazonaws.com/my-bucket/empty-template.yaml"
 
  # only print message
  EchoResource:
    Type: "AWS::CloudFormation::CustomResource"
    Properties:
      ServiceToken: "arn:aws:lambda:::function:my-echo-function"
      Properties:
        Message: "Hello, world!"
 
Outputs:
  EmptyOutput:
    Value: ""
  EchoOutput:
    Value: !GetAtt EchoResource.Outputs.Message

AWS CloudFormation 스크립트

1. 스크립트 요약

본 스크립트는 AWS CloudFormation을 활용하여 아래 기능을 자동 설정합니다.

  • 빈 리소스 스택 생성: EmptyResource 섹션은 empty-template.yaml 템플릿을 참조하여 빈 스택을 생성합니다. 실제 리소스는 없지만, 스택 구조 및 종속성을 정의하는 데 유용합니다.
  • 메시지 출력: EchoResource 섹션은 Lambda 함수 my-echo-function을 호출하여 "Hello, world!" 메시지를 출력합니다.
  • 출력 값 제공: Outputs 섹션은 EmptyOutput (빈 문자열) 및 EchoOutput (Lambda 함수 출력 메시지) 값을 제공합니다.

2. 스크립트 사용 방법

  1. 템플릿 파일 저장:
    • empty-template.yaml 파일을 S3 버킷에 저장합니다.
    • 본 스크립트 파일을 원하는 위치에 저장합니다.
  2. CloudFormation 스택 생성:
    • AWS 콘솔 또는 CLI를 사용하여 스크립트 파일을 참조하여 CloudFormation 스택을 생성합니다.
    • 스택 생성 시 my-echo-function Lambda 함수 ARN을 EchoResource 섹션의 ServiceToken 속성에 입력해야 합니다.
  3. 출력 확인:
    • 스택 생성 완료 후 Outputs 섹션의 EmptyOutputEchoOutput 값을 확인합니다.

3. 추가 기능 및 활용

3.1. 리소스 추가:

본 스크립트는 기본적인 예시이며, 실제 환경에 맞춰 다양한 리소스를 추가하여 자동 설정을 확장할 수 있습니다. 예를 들어, 다음과 같은 리소스를 추가할 수 있습니다.

  • EC2 인스턴스 생성 및 설정
  • RDS 데이터베이스 생성 및 설정
  • S3 버킷 생성 및 설정
  • CloudFront 배포 설정
  • Lambda 함수 생성 및 설정

3.2. 파라미터 및 조건 추가:

스크립트에 파라미터를 추가하여 스택 생성 시 사용자 입력 값을 받아 동적으로 설정을 변경할 수 있습니다. 또한 조건문을 활용하여 환경에 따라

설정을 조정할 수 있습니다.

EKS 생성 후 ALB ingress로 설정

apiVersion: "klodd.tjcsec.club/v1"
kind: Challenge
metadata:
name: test
spec:
name: Test Challenge
timeout: 10000
pods:
  - name: app
    ports:
      - port: 80
    spec:
      containers:
        - name: main
          image: traefik/whoami:latest
          resources:
            requests:
              memory: 100Mi
              cpu: 75m
            limits:
              memory: 250Mi
              cpu: 100m
      automountServiceAccountToken: false
expose:
  kind: http
  pod: app
  port: 80
middlewares:
  - contentType:
      autoDetect: false
  - rateLimit:
      average: 5
      burst: 10

kubectl apply -f challenge.yaml

apiVersion: "klodd.tjcsec.club/v1"
kind: Challenge
metadata:
  name: analects
spec:
  name: Analects
  timeout: 300000
  pods:
    - name: app
      ports:
        - port: 80
      spec:
        containers:
          - name: app
            image: analects-app:latest
            resources:
              requests:
                memory: 100Mi
                cpu: 50m
              limits:
                memory: 200Mi
                cpu: 100m
            startupProbe:
              httpGet:
                path: "/search.php?q=with%20two%20others"
                port: 80
              initialDelaySeconds: 0
              periodSeconds: 5
              failureThreshold: 30
        automountServiceAccountToken: false
    - name: mysql
      ports:
        - port: 3306
      spec:
        containers:
          - name: mysql
            image: analects-mysql:latest
            resources:
              requests:
                memory: 200Mi
                cpu: 50m
              limits:
                memory: 500Mi
                cpu: 100m
        automountServiceAccountToken: false
  expose:
    kind: http
    pod: app
    port: 80

위에 있는 yaml 파일을 생성하고 kubectl apply -f challenge.yaml 명령어를 실행하면 해당 리소스가 생성됩니다.

3.3. 배포 자동화:

AWS CodePipeline, CodeBuild 등을 활용하여 스크립트 업데이트 및 배포를 자동화할 수 있습니다.

3.4. 모듈화 및 재사용:

스크립트를 모듈화하여 코드 재사용성을 높이고, 다양한 환경에 맞춰 쉽게 조정할 수 있습니다.

4. 참고자료

5. 주의 사항

  • 스크립트를 사용하기 전에 내용을 충분히 검토하고, 필요에 따라 수정 및 보완해야 합니다.
  • 스크립트 실행으로 인해 발생하는 비용은 사용자의 책임입니다.
  • 스크립트는 예시이며, 실제 환경에 맞춰 조정해야 합니다.

6. 기타

본 스크립트는 기능경기대회 1과제 완료를 위한 기본적인 틀을 제공하며, 실제 환경에 맞춰 다양한 기능을 추가하고 확장할 수 있습니다.

본 스크립트가 기능경기대회 1과제 완료에 도움이 되기를 바랍니다.

작성일:
수정일:

이전글 / 다음글