Profile picture

YAML 포맷 이해하기

JaehyoJJAng2023년 04월 01일

YAML

데이터 정의

  • key: value 형태로 데이터 정의
  • 이때 콜론 : 뒤에는 키와 값을 구분하기 위해 반드시 공백문자가 있어야 함
# 주석
Fruit: Apple
Quantity: 5
Origin: Chungju

Array / Lists

  • 배열이나 리스트 구조의 데이터를 표현할 때는 '-'을 사용
  • 이때 각 요소들의 순서가 중요
  • '-'는 배열의 한 요소롤 가리킴

1번예제

Animal: 
  - dog
  - cat
  - lion

Programming:
  - Python
  - JavaScript

Dictionary / Map

  • 계층 구조 사용 시, 기본적으로 2칸 혹은 4칸의 들여쓰기 사용
  • 각 요소들의 순서가 중요하지 않음
Animal:
  Dog:
    - Jindo
    - Pomeranian
  Cat: 
    - Siamese
    - "Russian Blue"

Programming:
  Python:
    - Crawling
    - Automation
  JavaScript:
    - Web
    - "Other .."

Advanced

  • 위에서 작성한 데이터 구조를 섞어서 사용할 수도 있음

1.YAML

Fruits:
  - Banana
    Calories: 105
    Fat: 0.4g
    Carbs: 27g    
  - Grape
    Calories: 62
    Fat: 0.3g
    Carbs: 15g    

1.JSON

{
  "Fruit": [
    {
      "Banana: {
        "Calories": 105,
        "Fat": "0.4g",
        "Carbs": "27g",
      }
    },
    {
      "Grape": { 
        "Calories": 62,
        "Fat": "0.3g",
        "Carbs": "15g",
      }
    }
  ]
}

2.YAML

jaehyolee :
    - name: Jaehyo Lee
    - job:
      - System Engineer
tastejaehyo:
    company: false
    tech:
      web-front:
        - flutter
        - vue
        - react
      backend:
        - java
        - python

2.JSON

{
  "jaehyolee": [
    "name": "Jaehyo Lee",
    "job": ["System Enginner"]
  ],
  "tastejaehyo": {
    "company": false,
    "tech": {
      "web-fron": ["fluter","vue","react"],
      "backend": ["java","python"]
    }
  }
}

Multi-lines

  • 값으로 여러 행의 문장을 작성할 때 기본적으로는 줄바꿈 기호 '\n' 을 사용
example: "Hello I'm Jaehyo \n Bye"

# 출력 결과
Hello I'm Jaehyo
Bye

하지만 \n 을 사용하지 않고, | , > 을 사용하여 줄바꿈을 할 수도 있음

  • : 한 줄을 모두 비웠을 때만 줄바꿈으로 인식, 그냥 줄바꿈을 할 때에는 공백문자로 인식

줄바꿈

example1: >
  I'm Jaehyo
  This is Multiline String
  Bye

조건문 사용

steps:
  ...
  - name: The job has succeeded
    if: ${ success() }

변수 사용

foo: "{ variable }"
repository: "{ .SECRET_KEY }"

YAML 문법 비교

  • Docker compose 명령은 기본적으로 Dockerfile에서 익힌 명령에 기반하고 있다.

Docker run

$ docker run -d -it -p 3307:3306 --name mysql --rm -v /home/ubuntu/mysqldata/:/var/lib/mysql/ mysql:5.7

Dockerfile

FROM mysql:5.7
LABEL Description="a Test MySQL Server"
EXPOSE 3306
ENV MYSQL_ROOT_PASSWORD=1234
ENV MYSQL_DATABASE=testDB
ENV MYSQL_USER=testuser
ENV MYSQL_PASSWORD=1234

docker-compose.yml

version : "3"           # docker-compose version
services:
  db:                     # Container
    image: mysql:5.7  # Base Image
    restart: always     # Container Restart Option
    volumes:            # Volumes
      - ./mysqldata:/var/lib/mysql
    environment:       # 환경설정 세팅
      - MYSQL_ROOT_PASSWORD=1234
      - MYSQL_DATABASE=testDB
      - MYSQL_USER=testuser
      - MYSQL_PASSWORD=1234
    ports:                 # 호스트(사용자) 포트 3307번을 컨테이너 포트 3306으로 연결(매핑)
      - "3307:3306"

Yaml 작성 연습

예제 1

- 아래 표의 데이터를 YAML 포맷으로 변경하세요

image

Yaml

Car:
  Color: "Blue"
  Model:
    Name: "Cyber Truck"
    Year: 2022
  Fuel: "Electric"
  Price: "$100,000"

Json

{
  "Car": {
    "Color": "Blue",
    "Model": {
      "Name": "Cyber Truck",
      "Year": 2022
    },
    "Fuel": "Electric",
    "Price": "$100,000"
  }
}

예제 2

- 다음 데이터를 YAML 형식으로 변경하여 작성하세요

image

Yaml

Version: "2012-10-17"
Statement:  
  - Effect: Allow
    Action: ["ec2:*","elasticloadbalancing:*","route53:*","autoscaling:*","cloudwatch:*","SNS:*"]
    Resource: ["*"]
  - Effect: Allow
    Action: ["S3:*"]
    Resource: [
      "arn:aws:s#:::travis-teraaform-state","arn:aws:s#:::travis-terraform-state/*",
      "arn:aws:s#:::travis-shared-1-registry-images","arn:aws:s3:::travis-shared-1-registry-images/*",
      "arn:aws:s3:::travis-shared-2-registry-images","arn:aws:s3:::travis-shared-2-registry-images/*"]
  - Effect: Allow
    Action: ["iam:GetUser"]
    Resource: ["arn:aws:iam::341288657826:user/igor-terraform"]
  - Effect: Allow
    Action: ["iam:*"]
    Resource: ["arn:aws:iam:341288657826:role/*"]
  - Effect: Allow
    Action: ["dynamodb:*"]
    Resource: ["arn:aws:dynamodb:us-east-1:341288657826:table/travis-terraform-state"]

Json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["ec2:*","elasticloadbalancing:*","route53:*","autoscaling:*","cloudwatch:*","SNS:*"],
      "Resource": ["*"]
    },

    {
      "Effect": "Allow",
      "Action": ["S3:*"],
      "Resource": [
        "arn:aws:s#:::travis-teraaform-state","arn:aws:s#:::travis-terraform-state/*",
        "arn:aws:s#:::travis-shared-1-registry-images","arn:aws:s3:::travis-shared-1-registry-images/*",
        "arn:aws:s3:::travis-shared-2-registry-images","arn:aws:s3:::travis-shared-2-registry-images/*"
      ]
    },

    {
      "Effect": "Allow",
      "Action": ["iam:GetUser"],
      "Resource": ["arn:aws:iam::341288657826:user/igor-terraform"]      
    },

    {
      "Effect": "Allow",
      "Action": ["iam:*"],
      "Resource": ["arn:aws:iam:341288657826:role/*"]
    },

    {
      "Effect": "Allow",
      "Action": ["dynamodb:*"],
      "Resource": ["arn:aws:dynamodb:us-east-1:341288657826:table/travis-terraform-state"]
    }
  ]
}

예제 3

- 다음 JSON을 YAML로 변경

JSON

"test3": {
		"name": "Node.js CI",
		"on": {
			"push": {
				"branches": "main"
			},
			"pull_request": {
				"branches": "main"
			}
		},
		"jobs": {
			"build": {
				"runs-on": "ubuntu-latest",
				"steps": [
					{
						"uses": "actions/checkout@v2"
					},
					{
						"name": "Use Node.js",
						"uses": "actions/setup-node@v1",
						"with": {
							"always-auth": true,
							"node-version": "12.x",
							"registry-url": "https://registry.npmjs.org",
							"scope": "@octocat"
						}
					},
					{
						"name": "Install dependencies",
						"run": "npm ci",
						"env": {
							"NODE_AUTH_TOKEN": "${ secrets.NPM_TOKEN }"
						}
					}
				]
			}
		}
	}

YAML

test3:
  name: "Node.js CI"
  on:
    push:
      branches: "main"
    pull_request:
      branches: "main"
  jobs:
    build:
      runs-on: "ubuntu-latest"
      steps:
        - uses: "actions/checkout@v2"
        - name: "Use Node.js"
          uses: "actions/setup-node@v1"
          with:
            always-auth: true
            node-version: "12.x"
            registry-url: "https://registry.npmjs.org"
            scope: "@octocat"
        - name: "Install dependencies"
          run: "npm ci"
          env: 
            NODE_AUTH_TOKEN: "${{secrets.NPM_TOKEN}}"

Loading script...