콘텐츠로 이동

AIStor Release Storage Project 설정

0. 전제

  • Project 별 Bucket, Object Prefix, IAM, Access Key, GitLab CI/CD Variables 설정을 다룸.
  • {PROJECT_NAME} / {SERVICE_PREFIX} / {SERVICE_NAME} 기준은 12-GitLab 프로젝트 구조 정책을 따름.
  • Bucket 은 {PROJECT_NAME} 단위로 생성함.
  • 동일한 {PROJECT_NAME} Bucket 이 이미 존재하는 경우 1. Bucket 생성은 생략하고 2. IAM 및 Access Keys부터 수행함.
  • 하나의 {PROJECT_NAME} Bucket 내부에서 {SERVICE_PREFIX}/{SERVICE_NAME} Object Prefix 기준으로 서비스별 Release Artifact 를 분리 관리함.

1. Bucket 생성

  • {RELEASE_ENV}Release Yaml 파일 (.ops/ci/release-branch-versions/{CI_COMMIT_BRANCH}.yaml) 에 대응하는 branch/env 이름임
    • 예: pre-production, production, ko-dev-test
  • release target branch 를 추가하려면 GitLab repository 의 .ops/ci/release-branch-versions/{RELEASE_ENV}.yaml 과 Release Storage object prefix 구조가 동일한 env 이름을 사용해야 함
  • Bucket 은 PROJECT_NAME 단위로 구성함
  • 하나의 PROJECT_NAME Bucket 내부에서 SERVICE_PREFIX / SERVICE_NAME 기준으로 release artifact 를 분리 관리함
  • release/current 구조는 bucket 내부 prefix 로 관리함
  • bucket 수를 최소화하여 정책 및 운영 복잡도를 줄임

1.1 Object 구조

bucket:
{PROJECT_NAME}

object:
{SERVICE_PREFIX}/{SERVICE_NAME}
└── {RELEASE_ENV}
    ├── releases
    │   ├── {RELEASE_ENV}-{PACKAGE_VERSION}.json
    │   ├── {SERVICE_NAME}-{RELEASE_ENV}-{PACKAGE_VERSION}.tar.gz
    │   └── {SERVICE_NAME}-{RELEASE_ENV}-{PACKAGE_VERSION}.tar.gz.sha256
    └── current
        └── {RELEASE_ENV}.json

경로 운영 기준:

경로 역할 overwrite
releases Immutable Release Archive 저장 금지
current/{RELEASE_ENV}.json 운영 서버 polling 대상 Release Pointer 허용

운영 기준:

  • 운영 서버는 current/{RELEASE_ENV}.json 만 polling 함
  • 운영 서버는 current/{RELEASE_ENV}.json 에 명시된 releases 경로의 package 를 다운로드함
  • 운영 서버는 releases 경로를 직접 탐색(list)하지 않음
  • rollback 은 current/{RELEASE_ENV}.json 을 이전 Release Metadata 로 재지정하여 수행함
  • current 는 symlink 가 아닌 고정 Object Key Pointer 개념으로 운영함
  • 운영 서버는 current/{RELEASE_ENV}.json 의 package_version 변경 여부를 기준으로 신규 release 를 감지함.

1.2 AIStor Console (WebUI) 접속

https://release-console.example.com

1.3 로그인

Username: MINIO_ROOT_USER
Password: MINIO_ROOT_PASSWORD

1.4 경로

AIStor Console (WebUI) → Buckets → Add Bucket

1.5 설정

  • Bucket Name: {PROJECT_NAME}
  • Type: Basic

1.6 Type: Locked 미사용

  • Type: Locked 선택 시 Object Lock(WORM) 활성화 bucket 생성

운영 판단 기준:

  • current/{RELEASE_ENV}.json 은 Release Pointer 역할이므로 overwrite 가 반드시 필요함
  • Object Lock 활성화 시 Versioning 및 Retention 관리 복잡도가 증가함
  • 현재 구조는 운영 정책 기반 immutable 방식으로 충분히 운영 가능함
    • CI 에서 releases 경로 기존 Object overwrite 차단
    • Immutable release filename 정책 적용
    • rollback 은 current/{RELEASE_ENV}.json 재지정 방식으로 수행

2. IAM 및 Access Keys

  • 역할별 Policy, IAM Group, IAM User, Access Key 를 생성함
  • GitLab CI/CD 와 운영 서버 권한을 분리하여 관리함
  • 역할별 계정은 필요한 최소 권한만 부여함
  • s3:DeleteObject 권한은 부여하지 않음

용도:

GitLab Runner → AIStor Release Storage publish
운영 서버 → AIStor Release Storage read/pull deploy

명명 기준

  • IAM Policy, IAM User, Access Key 는 {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-{ROLE} 기준으로 명명함.

역할 기준:

ROLE 용도
gitlab GitLab CI/CD 에서 Release Artifact / Metadata 를 AIStor Release Storage 로 publish 하는 용도
op-servers 운영 서버에서 Release Metadata / Package 를 read/pull deploy 하는 용도

기본 명명 구조:

{PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}
└── {ROLE}
    ├── Policy : policy
    ├── User : user
    ├── Access Key : ak
    └── Access Key Json Download : ak.json

예시: example/frontend/example.com

example-frontend-example.com
├── gitlab
│   ├── Policy : example-frontend-example.com-gitlab-policy
│   ├── User : example-frontend-example.com-gitlab-user
│   ├── Access Key : example-frontend-example.com-gitlab-ak
│   ├── Access Key Name : e-f-e-gitlab-ak. 최대 32자 제한
│   └── Access Key Json Download : example-frontend-example.com-gitlab-ak.json
└── op-servers
    ├── Policy : example-frontend-example.com-op-servers-policy
    ├── User : example-frontend-example.com-op-servers-user
    ├── Access Key : example-frontend-example.com-op-servers-ak
    ├── Access Key Name : e-f-e-op-servers-ak. 최대 32자 제한
    └── Access Key Json Download : example-frontend-example.com-op-servers-ak.json

2.1 AIStor Console (WebUI) 접속

https://release-console.example.com

2.2 IAM Policies

AIStor Console (WebUI) → Access → IAM Policies → Add Policy

GitLab CI/CD 용

  • Policy Name: {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-policy
  • Policy JSON:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "GitLabWriteReleaseObjects",
                "Effect": "Allow",
                "Action": [
                    "s3:AbortMultipartUpload",
                    "s3:GetObject",
                    "s3:ListMultipartUploadParts",
                    "s3:PutObject"
                ],
                "Resource": [
                    "arn:aws:s3:::{PROJECT_NAME}/{SERVICE_PREFIX}/{SERVICE_NAME}/*/current/*",
                    "arn:aws:s3:::{PROJECT_NAME}/{SERVICE_PREFIX}/{SERVICE_NAME}/*/releases/*"
                ]
            },
            {
                "Sid": "GitLabGetBucketLocation",
                "Effect": "Allow",
                "Action": [
                    "s3:GetBucketLocation"
                ],
                "Resource": [
                    "arn:aws:s3:::{PROJECT_NAME}"
                ]
            },
            {
                "Sid": "GitLabListReleaseBucket",
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::{PROJECT_NAME}"
                ],
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "{SERVICE_PREFIX}/{SERVICE_NAME}/*"
                        ]
                    }
                }
            },
            {
                "Sid": "GitLabListMultipartUploads",
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucketMultipartUploads"
                ],
                "Resource": [
                    "arn:aws:s3:::{PROJECT_NAME}"
                ]
            }
        ]
    }
    

운영 서버들 용

  • Policy Name: {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-op-servers-policy
  • Policy JSON:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "OpServersReadReleaseObjects",
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject"
                ],
                "Resource": [
                    "arn:aws:s3:::{PROJECT_NAME}/{SERVICE_PREFIX}/{SERVICE_NAME}/*/current/*",
                    "arn:aws:s3:::{PROJECT_NAME}/{SERVICE_PREFIX}/{SERVICE_NAME}/*/releases/*"
                ]
            },
            {
                "Sid": "OpServersGetBucketLocation",
                "Effect": "Allow",
                "Action": [
                    "s3:GetBucketLocation"
                ],
                "Resource": [
                    "arn:aws:s3:::{PROJECT_NAME}"
                ]
            },
            {
                "Sid": "OpServersListReleaseBucket",
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::{PROJECT_NAME}"
                ],
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "{SERVICE_PREFIX}/{SERVICE_NAME}/*"
                        ]
                    }
                }
            }
        ]
    }
    

2.3 IAM Groups

AIStor Console (WebUI) → Access → IAM Groups → Add a Group

GitLab CI/CD 용

  • Group Name: gitlab
  • Members: 추후 IAM Users 에서 User 추가 시 IAM Groups 설정에서 이 Group 이름을 Check 하면 자동으로 추가됨.
  • Policies: {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-policy 를 찾아서 Check.

운영 서버들 용

  • Group Name: op-servers
  • Members: 추후 IAM Users 에서 User 추가 시 IAM Groups 설정에서 이 Group 이름을 Check 하면 자동으로 추가됨.
  • Policies: {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-op-servers-policy 를 찾아서 Check.

2.4 IAM Users

AIStor Console (WebUI) → Access → IAM Users → Add a User

GitLab CI/CD 용

  • Username: {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-user
  • Password: 강한 랜덤 비밀번호 사용
  • IAM Groups: gitlab 를 찾아서 Check.
  • Policies: IAM Groups 에서 상속되므로 직접 부여 불필요 또는 {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-policy 를 찾아서 Check.

운영 서버들 용

  • Username: {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-op-servers-user
  • Password: 강한 랜덤 비밀번호 사용
  • IAM Groups: op-servers 를 찾아서 Check.
  • Policies: IAM Groups 에서 상속되므로 직접 부여 불필요 또는 {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-op-servers-policy 를 찾아서 Check.

2.5 Access Keys

AIStor Console (WebUI) → Access → IAM Users → Access Key 를 생성하려는 User 선택 → Access Keys → Create Access Key

GitLab CI/CD 용

  • Access Key: 자동 생성값 사용. 아래 Clear Button 을 누르면 계속 변경됨.
  • Secret Key: 자동 생성값 사용. 아래 Clear Button 을 누르면 계속 변경됨.
  • Expires: 필요 시 만료일 설정.
  • Name: 최대 32 글자 제한.
  • Description: 필요시 작성.
  • Comments: 필요시 작성.
  • Restrict beyond user policy: 비활성화

운영 서버들 용

  • Access Key: 자동 생성값 사용. 아래 Clear Button 을 누르면 계속 변경됨.
  • Secret Key: 자동 생성값 사용. 아래 Clear Button 을 누르면 계속 변경됨.
  • Expires: 필요 시 만료일 설정.
  • Name: 최대 32 글자 제한.
  • Description: 필요시 작성.
  • Comments: 필요시 작성.
  • Restrict beyond user policy: 비활성화

생성 후 Download for Import 로 별도 저장 권장

  • {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-ak.json
  • {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-op-servers-ak.json

3. GitLab CI/CD Variables

  • 본 절의 Variable 은 Protected Branch / Protected Tag 에서만 사용하는 CI/CD 변수 기준으로 설명함
  • 따라서 아래 Variable 은 Protected Variable 기준으로 설정함
  • release target branch 는 .ops/ci/release-branch-versions/{branch}.yaml 존재 여부로 결정함
  • Protected Variable 을 사용하는 경우, release target branch 도 GitLab Protected Branch 로 등록되어 있어야 함
  • 예를 들어 ko-dev-test.yaml 을 추가하여 ko-dev-test 를 release target 으로 사용할 경우, ko-dev-test branch 도 Protected Branch 정책에 포함해야 함
Variable 설명 특이사항
MINIO_ENDPOINT AIStor S3 API Endpoint HTTPS Endpoint 사용
MINIO_REGION AWS S3 호환성 및 SDK 동작을 위한 Region 변수 AWS 미사용 환경이어도 생성 권장. 일반적으로 ap-northeast-2 또는 실제 S3 Region 명 사용
MINIO_ACCESS_KEY S3 접속용 IAM User 의 Access Key 위에서 생성한 {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-user 의 Access Key 사용
MINIO_SECRET_KEY S3 접속용 IAM User 의 Secret Key 위에서 생성한 {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-user 의 Secret Key 사용
MINIO_BUCKET Release Storage Bucket 서비스(Project) 단위 Bucket 사용
MINIO_SERVICE_PREFIX Release Storage Object Prefix 예: {SERVICE_PREFIX}/{SERVICE_NAME}

3.1 경로

  • 최고 관리자 계정(Admin) 또는 운영 책임자 계정 으로 수행함.
Project → Settings → CI/CD → Variables → Add variable

3.2 설정

  • Type:
    • Variable (default)
  • Environments:
    • All (default)
    • 현재 구조는 Protected Branch / Protected Variable 기반으로 운영함
  • Visibility:
    • Visible
    • Job log 에 값 노출 가능
    • Masked
    • Job log 에 값 마스킹
    • GitLab UI 에서 값 재확인 가능
    • Masked and hidden
    • Job log 마스킹
    • 저장 후 GitLab UI 에서 값 재확인 불가
  • Protect variable:
    • Protected Branch / Protected Tag 에서만 Variable 사용 가능
    • Protected Branch / Protected Tag 에서 쓰이는 변수이기 때문에 활성화
  • Expand variable reference:
    • 일반 Secret 변수는 비활성화 권장
  • Description (optional): 필요시 작성
  • Key & Value:
Key Value 기준 Visibility Protect variable 비고
MINIO_ENDPOINT AIStor S3 API URL. ex) https://release.sncompany.com Visible 활성화 HTTPS Endpoint 사용
MINIO_REGION 실제 S3 Bucket 이 위치한 Region 명. default : ap-northeast-2 Visible 활성화 AWS 미사용 환경이어도 생성 권장
MINIO_ACCESS_KEY {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-user 의 Access Key Masked and hidden 활성화 GitLab CI/CD publish 용
MINIO_SECRET_KEY {PROJECT_NAME}-{SERVICE_PREFIX}-{SERVICE_NAME}-gitlab-user 의 Secret Key Masked and hidden 활성화 GitLab CI/CD publish 용
MINIO_BUCKET {PROJECT_NAME} Visible 활성화 Project 단위 Bucket 이름
MINIO_SERVICE_PREFIX {SERVICE_PREFIX}/{SERVICE_NAME} Visible 활성화 Project 기준 Object Prefix