RDS/S3/ECR/Redis/Secrets Manager/Service Account 설정
목차
- 사전 준비
- RDS 생성하기
- S3 Bucket 생성하기
- ECR Repository 생성하기
- Redis 생성하기
- Secrets Manager 생성하기
- Kubernetes Service Account 생성하기
자세한 단계
{변수}의 자세한 설명은 Terminology 페이지를 참고하세요
1. 사전 준비
설치를 위한 환경 설정이 완료 되어야 합니다. (1. 설치 환경 셋업하기 참고)
2. RDS 생성하기
{변수} 는 직접 입력하여 주세요
- RDS Subnet Group 생성하기
- AWS RDS Console에 접속 후 왼쪽 하단의 Subnet groups 를 클릭하세요
- Step 1 : Create DB subnet group
- Step 2 : Subnet group details
- Name : sng-rds-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-mysql
- Description : 필수 입력
- VPC: {AWS_VPC_NAME} 선택
- Step 3 : Add subnets
- Availability Zones : {AWS_DEFAULT_REGION}a, {AWS_DEFAULT_REGION}c 선택
- Subnets : Public subnet 만 Check 합니다.
- Step 4 : Create
- RDS Instance 생성하기
- AWS RDS Console에 접속하세요
- Create database 버튼을 눌러 RDS 생성을 시작합니다.
- Step 1 : Choose a database creation method
- Standard create
- Step 2 : Engine options
- Engine type: MySQL
- Edition: MySQL Community
- Engine Version: MySQL 8.0.33
- Step 3 : Templates
- Production
- Step 4: Availability and durability
- Multi-AZ DB instance → 이중화 필요 시 Multi AZ 선택
- Step 5 : Settings
- DB instance identifier: rds-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-mysql
- Master username: admin
- Master password : 2가지 옵션 중 선택
- Self managed : 비밀번호 생성 (권장)
- Auto generate password : RDS 에서 자동 생성되며, RDS 생성 후 1회 확인 가능
- Master password : 사용자가 비 밀번호 생성
- Managed in AWS Secrets Manager : AWS에서 비밀번호 자동 생성
- AWS Secret Manager Console 로 이동
- rds-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-mysql 클릭
- Secret value -> Retrieve secret value
- Self managed : 비밀번호 생성 (권장)
- Step 6 : Instance configuration
- DB instance class: Standard classes
- Instance type: db.m5.large
- Step 7: Storage
- Storage type: General Purpose SSD (gp2)
- Allocated storage: 50GiB
- Storage autoscaling: Uncheck Enable storage autoscaling
- Step 8: Connectiviry
- Compute resource: Don't connect to an EC2 compute resource
- Network type: IPv4
- VPC: {AWS_VPC_NAME} 선택
- DB subnet group: sng-rds-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-mysql
- Public access: Yes
- VPC security group: Create new
- New VPC security group name: scg-rds-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-mysql
- Additional configuration -> Database port: 3310
- Step 9: Database authentication
- Database authentication options: Password authentication
- Step 10: Monitoring
- Performance Insights: Check Turn on Performance Insights
- Retention period: 7 days
- AWS KMS key: aws/rds
- Step 11: Create database
- Step 12: Security Group 추가 설 정 (RDS 생성 완료 후 진행)
- AWS EC2 Console 접속하고, 왼쪽 하단의 Security Groups 클릭
- scg-rds-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-mysql 선택
- Edit Inbound rules 클릭
- Add rules 클릭
- Port range: 3310
- Source: eks의 sg 선택(예: eks-cluster-sg-{AWS_CLUSTER_NAME})
- Save rules
-
RDS User 생성 및 권한 부여
-
위 단계에서 생성된 RDS의 주소 및 admin 계정 정보를 확인하고, 변수에 저장합니다. (첫번째 페이지의 변수 목록에 업데이트)
export DB_HOST=
export DB_PORT=3310
export DB_ADMIN_USERNAME=admin
export DB_ADMIN_PASSWORD=
export DB_APP_USERNAME=`echo ${INFRA_NAME}_APP | tr [:lower:] [:upper:]`
export DB_APP_PASSWORD= -
DB 접속
mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_ADMIN_USERNAME} -p
# 입력 : ${DB_ADMIN_PASSWORD} -
DB USER 생성 및 권한부여
create user '${DB_APP_USERNAME}'@'%' identified by '${DB_APP_PASSWORD}';
GRANT SELECT, PROCESS, SHOW DATABASES, SHOW VIEW ON *.* TO `${DB_APP_USERNAME}`@`%`;
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `cachedb`.* TO `${DB_APP_USERNAME}`@`%`;
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `kubeflow`.* TO `${DB_APP_USERNAME}`@`%`;
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `metadb`.* TO `${DB_APP_USERNAME}`@`%`;
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `mlpipeline`.* TO `${DB_APP_USERNAME}`@`%`;
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `ai_conductor`.* TO `${DB_APP_USERNAME}`@`%`;
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `edge_conductor`.* TO `${DB_APP_USERNAME}`@`%`;
-
- RDS 접근을 위한 Security Group 추가 설정 (Options)
- RDS를 외부에서 접근하기 위해서는 Inbound Rule 을 추가해야 합니다.
- AWS RDS Console에 접속 후 왼쪽 하단의 Security Groups 를 클릭하세요
- scg-rds-{AWS_DEFAULT_REGION_ALIAS}-{INFRA-NAME}-{DEPLOY_ENV}-mysql 검색하여 클릭
- Inbound rules 탭에서 Edit inbound rules 클릭하여 Inbound Rule을 추가합니다.
3. S3 Bucket 생성하기
{변수} 는 직접 입력하여 주세요
-
총 3개의 S3 Bucket 이 필요하고, 각각의 용도는 아래와 같습니다
- s3-{AWS_DEFAULT_REGION_ALIAS}--{INFRA_NAME}-{DEPLOY_ENV}-aia : mellerikat 운영 버킷
- s3-{AWS_DEFAULT_REGION_ALIAS}--{INFRA_NAME}-{DEPLOY_ENV}-kubeflow : Kubeflow 운영 버킷
- NOTE : edge app을 on premise로 설치하는 경우 건너뜁니다.
- s3-{AWS_DEFAULT_REGION_ALIAS}--{INFRA_NAME}-{DEPLOY_ENV}-edgeapp : Edge App 운영 버킷
-
S3 Bucket 생성
- AWS S3 Console 로 이동합니다.
- Create bucket 버튼을 눌러 S3 Bucket을 생성합니 다.
- Step1 : General configureation Bucket name: s3-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-aia
- Step2 : Create bucket
- 같은 방법으로 아래 Bucket들도 생성합니다.
- s3-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-kubeflow
- NOTE : edge app을 on premise로 설치하는 경우 건너뜁니다.
- s3-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-edgeapp
4. ECR Repository 생성하기
- Kubeflow 설치를 위한 이미지 저장소를 생성합니다.
aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com
aws ecr create-repository --repository-name ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/ml-pipeline/api-server
aws ecr create-repository --repository-name ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/oidc-authservice
aws ecr create-repository --repository-name ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/kubeflowkatib/katib-db-manager
aws ecr create-repository --repository-name ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/ml-pipeline/cache-server - AI Conductor 설치를 위한 이미지 저장소를 생성합니다.
aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com
aws ecr create-repository --repository-name ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/ai-advisor/ai-conductor/aic-webserver
aws ecr create-repository --repository-name ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/ai-advisor/ai-conductor/aic-frontend
5. Redis 생성하기
{변수} 는 직접 입력하여 주세요
-
mellerikat는 로그인 세션 정보를 저장하기 위해 Redis를 사용합니다.
-
Redis의 Security Groups 생성
- AWS EC2 Console 로 이동합니다.
- 왼쪽 메뉴의 Security Groups 를 클릭합니다.
- Create security group 버튼을 클릭해서 Redis의 security group을 생성합니다.
- Step 1: Basic details
- Security group name: scg-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-redis
- Description : 필수 입력
- VPC: {AWS_VPC_NAME} 선택
- Step 2: Inbound rules
- Add rule 클릭
- Port range: 6379
- Source: eks의 sg 선택(예: eks-cluster-sg-eks-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-1-28-eks-master)
- Step 3: Create security group
-
Redis 생성
- AWS ElastiCache Console 로 이동합니다.
- 왼쪽 메뉴의 Redis caches를 클릭합니다.
- Create Redis Cache 버튼을 눌러 Redis 생성을 진행합니다.
- Step 1: Configuration
- Deployment option: Design your own cache
- Creation method: Cluster cache
- Cluster mode: Disabled
- Step 2: Cluster info
- Name: elasticache-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-redis
- Step 3: Location
- Location: AWS Cloud
- Multi-AZ: Enabled
- Step 4: Cluster settings
- Engine Version: 7.1
- Port: 6379
- Parameter group: default.redis7
- Node type:
- 권장 : cache.m6g.large
- AWS ElastCache Node type을 참고하여 Node type 선택
- Number of replicas: 1
- Step 5: Connectivity
- Network type: IPv4
- Subnet groups: Create a new subnet group
- Name: sng-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-redis-private
- VPC ID : {AWS_VPC_NAME} 선택
- Selected subnets : Manage
- SubnetPrivate 만 체크
- Next
- Step 6: Security
- Encryption at rest: Disabled
- Encryption in transit: Disabled
- Step 7: Selected security group
- Manage: scg-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-redis
- Step 8: Backup
- Enable automatic backups : 체크
- Backup retention period: 1
- Backup window: Specify backup window
- Backup start time: 02:30
- Backup duration: 1
- Step 9: Maintenance
- Maintenance window: Specify maintenance window
- Maintenance start day: Tuesday
- Maintenance start time: 01:00
- Maintenance duration: 1
- Auto upgrade minor versions: Enabled
- Next
- Create
-
Redis 생성 후 추가 설정
- AWS ElastiCache Console 로 이동합니다.
- 왼쪽 메뉴의 Redis caches를 클릭합니다.
- Redis caches 에서 elasticache-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-redis 를 클릭합니다.
- Modify 를 클릭합니다.
- Security 섹션에서 Encryption in transit의 Enable 를 체크합니다.
- Preview changes 클릭합니다
- Modify 클릭합니다.
- Redis 변수 설정
-
AWS ElastiCache Console 로 이동합니다.
-
왼쪽 메뉴의 Redis caches를 클릭합니다.
-
Redis caches 에서 elasticache-{AWS_DEFAULT_REGION_ALIAS}-{INFRA_NAME}-{DEPLOY_ENV}-redis 를 클릭합니다.
-
Cluster details 에서 Primary endpoint 는 {REDIS_HOST}:{REDIS_PORT} 입니다.
export REDIS_HOST=
export REDIS_PORT=6379
-
6. Secrets Manager 생성하기
- mellerikat는 RDS 암호화 정보 및 S3에 접근할때 Secrets Manager에 등록된 정보를 활용합니다. 필요한 정보들을 저장하기 위해 Secrets Manager 설정을 아래와 같이 진행합니다.
# SECRETS MANAGER 변수 설정 (Kubeflow 설치 시 필요)
export AWS_SECRETS_MANAGER_S3=/parameter/${AWS_DEFAULT_REGION}/${INFRA_NAME}/${DEPLOY_ENV}/s3
export AWS_SECRETS_MANAGER_RDS=/parameter/${AWS_DEFAULT_REGION}/${INFRA_NAME}/${DEPLOY_ENV}/rds
# S3
aws secretsmanager create-secret --name ${AWS_SECRETS_MANAGER_S3} \
--secret-string '{"accesskey":"'${KUBEFLOW_USER_AWS_ACCESS_KEY_ID}'","secretkey":"'${KUBEFLOW_USER_AWS_SECRET_ACCESS_KEY}'"}' --region ${AWS_DEFAULT_REGION}
# RDS
aws secretsmanager create-secret --name ${AWS_SECRETS_MANAGER_RDS} \
--secret-string '{"username":"'${DB_APP_USERNAME}'","password":"'${DB_APP_PASSWORD}'","database":"kubeflow","host":"'${DB_HOST}'","port":"'${DB_PORT}'"}' --region ${AWS_DEFAULT_REGION}
```
7. Kubernetes Service Account 생성하기
-
이 단계에서는 S3, ECR 등 자원 접근에 대한 policy 들과 해당 정책을 부여받은 Service Account를 생성합니다.
- Service Account 가 속할 Namespace가 없다면, Service Account 생성 시 자동으로 생성 됩니다.
- kubeflow
- ai-conductor
- edge-conductor
- edge-app
- Service Account 가 속할 Namespace가 없다면, Service Account 생성 시 자동으로 생성 됩니다.
-
IAM policy 생성
- mellerikat 용 Secret Manager Policy 생성을 정의한 policy-secret-manager-aia-r.yaml 을 생성합니다.
[Expand policy-secret-manager-aia-r.yaml]
cat <<EOT > policy-secret-manager-aia-r.yaml
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGetRdsSecretViaSsm",
"Effect": "Allow",
"Action": [
"ssm:GetParameters",
"ssm:GetParameter",
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:ssm:${AWS_DEFAULT_REGION}:${AWS_ACCOUNT_ID}:parameter/aws/reference/secretsmanager/*",
"arn:aws:secretsmanager:${AWS_DEFAULT_REGION}:${AWS_ACCOUNT_ID}:secret:/parameter/${AWS_DEFAULT_REGION}/${INFRA_NAME}/${DEPLOY_ENV}/*"
]
}
]
}
EOTaws iam create-policy --policy-name policy-secret-manager-aia-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV} --policy-document file://policy-secret-manager-aia-r.yaml
- mellerikat 용 S3 Policy 생성을 정의한 policy-s3-aia-rwd.yaml 을 생성합니다.
[Expand policy-s3-aia-rwd.yaml]
cat <<EOT > policy-s3-aia-rwd.yaml
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3BucekDeliverableRWD",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectAttributes",
"s3:GetObjectTagging",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::s3-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}-aia",
"arn:aws:s3:::s3-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}-aia/*"
]
}
]
}
EOTaws iam create-policy --policy-name policy-s3-aia-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV} --policy-document file://policy-s3-aia-rwd.yaml
- Kubeflow 용 S3 Policy 생성을 정의한 policy-s3-kubeflow-rwd.yaml 을 생성합니다.
[Expand policy-s3-kubeflow-rwd.yaml]
cat <<EOT > policy-s3-kubeflow-rwd.yaml
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3BucekKubeflowRWD",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectAttributes",
"s3:GetObjectTagging",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::s3-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}-kubeflow",
"arn:aws:s3:::s3-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}-kubeflow/*"
]
}
]
}
EOTaws iam create-policy --policy-name policy-s3-kubeflow-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV} --policy-document file://policy-s3-kubeflow-rwd.yaml
- mellerikat 용 ECR Policy 생성을 정의한 policy-ecr-aia-rwd.yaml 을 생성합니다.
[Expand policy-ecr-aia-rwd.yaml]
cat <<EOT > policy-ecr-aia-rwd.yaml
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECRFullRWD",
"Effect": "Allow",
"Action": "ecr:*",
"Resource": [
"arn:aws:ecr:${AWS_DEFAULT_REGION}:${AWS_ACCOUNT_ID}:repository/ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}",
"arn:aws:ecr:${AWS_DEFAULT_REGION}:${AWS_ACCOUNT_ID}:repository/ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/*"
]
}
]
}
EOTaws iam create-policy --policy-name policy-ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV} --policy-document file://policy-ecr-aia-rwd.yaml
- Edge App 용 S3 Policy 생성을 정의한 policy-s3-edge-app-rwd.yaml 을 생성합니다.
- NOTE : edge app을 on premise로 설치하는 경우 건너뜁니다.
[Expand policy-s3-edge-app-rwd.yaml]
cat <<EOT > policy-s3-edge-app-rwd.yaml
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3BucekEdgeAppRWD",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectAttributes",
"s3:GetObjectTagging",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::s3-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}-edgeapp",
"arn:aws:s3:::s3-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}-edgeapp/*"
]
}
]
}
EOT