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_NAMEBucket 내부에서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재지정 방식으로 수행
- CI 에서
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-testbranch 도 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 변수는
비활성화권장
- 일반 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 |