공부하기싫어

[Test] Code 에서 AWS Credential 분리/제거

 

담당자 cyaninn entj
상태
 
완료
요약 k3s cluster 에서 사용할 aws credential 을 code 에서 분리
마감일
프로젝트 [MSA] Ethereum-Autotrade
스프린트 [Sprint-2] 7월 2주차
상위 작업 [Prod] Prototype.v.1.2 배포
태그 DevTest
작업 ID TSK-19

 

1. 테스트 목적

  • 현재 image 안에 미리 선언된 AWS Credential 을 코드에서 분리
  • aws cli configure 가 미리 선언되어 동작하지 못하면 docker image build 가 fail 되는 현상 해결

 

2. 테스트 계획

  1. 기존 dockerfile 에 정의된 ‘CMD’ 를 제거한 후 build
  1. k8s secret 을 사용해 aws credential 정의 후 pod 의 container 에서 환경변수로 사용
  1. k8s 의 manifest 파일에서 python 코드 실행 명령 전달하여 프로세스 실행

 

3. 테스트 환경

  • 현재 사용하는 AWS 계정에서 DynamoDB Table 을 읽어오는 동작을 하는 간단한 프로세스
  • master node 의 hostpath 를 PV 로 사용해 동작 결과 확인
  • image repository 는 public hub.docker 사용

3.1 Image build

3.1.1 codes
  • Dir Tree
$ tree
├── container
│   ├── app.py
│   ├── Dockerfile
│   ├── requirements.txt
│   └── run.sh
├── create-secret-for-aws-credential.sh
├── test_manifest.yaml
├── test-pvc.yaml
└── test-pv.yaml
  • app.py
import os
import datetime
import boto3
import time

def open_logfile(n):
    log_file_name=n
    f=open(log_file_name, 'a')
    return f

def write_and_flush_logs(f, log_string):
    logs=log_string+"\n"
    f.write(logs); f.flush()

def close_logfile(f):
    f.close()

def read_dynamoDB_table() :
    global best_k
    global predicted_end_price
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('table-for-Ethereum-Autotrade')

    response = table.get_item(
        Key={
            'Env': 'Dev'
        }
    )

    item = response['Item']
    best_k = item['k-value']
    predicted_end_price = item['endprice']

    return best_k, predicted_end_price



log_file_name="output/output.log"
logfile=open_logfile(log_file_name)

try :
    bestk,predicted_end_price = read_dynamoDB_table()
    logs="success : get_parameter_fromSSM, read_dynamoDB_table"
    write_and_flush_logs(logfile, logs)
    logs="bestk : "+str(bestk)+" , end_price : "+str(predicted_end_price)
    write_and_flush_logs(logfile, logs)
except Exception as e:
    logs="failure : get_parameter_fromSSM, read_dynamoDB_table"
    write_and_flush_logs(logfile, logs)
    logs="Exception : "+str(e)
    write_and_flush_logs(logfile, logs)

while True :
    now = datetime.datetime.now()
    logs="running :"+str(now)
    write_and_flush_logs(logfile, logs)
    time.sleep(5)

aws credential 을 사용해 dynamoDB table 을 읽어온 후 5초에 한번씩 현재 시간을 찍는 간단한 프로그램 작성

 

  • requirements.txt
boto3
  • Dockerfile
FROM python:3.10

RUN apt-get update && apt-get install -y \
    awscli \
    vim

WORKDIR /home

COPY . .

RUN pip install --upgrade pip
RUN pip3 install -r requirements.txt
  • run.sh
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
python3 app.py > output/output.log
  • create-secret-for-aws-credential.sh
k create secret generic aws-credential -n test \
    --from-literal=aws-access-key='my-aws-access-key' \
    --from-literal=aws-secret-access-key='my-aws-secret-access-key' \
    --from-literal=aws-default-region='ap-northeast-2'
  • test-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/home/ubuntu/test/tmp"
  • test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
  namespace: test
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  • test-manifest.yaml
apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
  namespace: test
spec:
  volumes:
  - name: task-pv-storage
    persistentVolumeClaim:
      claimName: task-pv-claim
  containers:
  - name: task-pv-container
    image: cyaninn/test:v.1.2.2
    volumeMounts:
      - mountPath: "/home/output"
        name: task-pv-storage
    env:
    - name: AWS_ACCESS_KEY_ID
      valueFrom:
        secretKeyRef:
          name: aws-credential
          key: aws-access-key
    - name: AWS_SECRET_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: aws-credential
          key: aws-secret-access-key
    - name: AWS_DEFAULT_REGION
      valueFrom:
        secretKeyRef:
          name: aws-credential
          key: aws-default-region
    command: ["sh", "/home/run.sh"]
  • 마운트 경로를 /home 이 아닌 /home/output 으로 설정하여 기존 파일들이 날아가는 것을 피함
  • run.sh 에서 output/ 에 파일을 저장하게 하여 hostpath 에서 output.log 를 확인할 수 있게 함

 

3.1.2 build & push

  • build
/container$ ls
app.py  Dockerfile  requirements.txt  run.sh

/container$ docker build --tag cyaninn/test:v.1.2.2
  • push
docker push cyaninn/test:v.1.2.2

 

  • 확인
$ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
cyaninn/test               v.1.2.2   23630dd808d7   25 minutes ago      1.31GB
cyaninn/test               v.1.2.1   40203214f70c   About an hour ago   1.31GB

 

3.2 create k8s secret

/test$ k create secret generic aws-credential -n test \
    --from-literal=aws-access-key='-' \
    --from-literal=aws-secret-access-key='-' \
    --from-literal=aws-default-region='ap-northeast-2'
secret/aws-credential created
ubuntu@k3s-master:~/test$ k get secret -n test
NAME             TYPE     DATA   AGE
aws-credential   Opaque   3      51m

3.3 create PV, PVC

ubuntu@k3s-master:~/test$ k apply -f test-pv.yaml 
persistentvolume/task-pv created
ubuntu@k3s-master:~/test$ k apply -f test-pvc.yaml 
persistentvolumeclaim/task-pv-claim created
ubuntu@k3s-master:~/test$ k get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
task-pv   5Gi        RWO            Retain           Bound    test/task-pv-claim   manual                  14s
ubuntu@k3s-master:~/test$ k get pvc -n test
NAME            STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
task-pv-claim   Bound    task-pv   5Gi        RWO            manual         20s

4. 테스트 결과

ubuntu@k3s-master:~/test$ k apply -f test-v-1-2-3.yaml 
pod/task-pv-pod created
ubuntu@k3s-master:~/test$ k get all -n test
NAME              READY   STATUS              RESTARTS   AGE
pod/task-pv-pod   0/1     ContainerCreating   0          5s
ubuntu@k3s-master:~/test$ 
ubuntu@k3s-master:~/test$ k get all -n test
NAME              READY   STATUS    RESTARTS   AGE
pod/task-pv-pod   1/1     Running   0          11s
ubuntu@k3s-master:~/test$ cd tmp/
ubuntu@k3s-master:~/test/tmp$ ls
output.log
ubuntu@k3s-master:~/test/tmp$ head output.log 
success : get_parameter_fromSSM, read_dynamoDB_table
bestk : 0.1 , end_price : 2385718.230331
running :2023-07-12 21:21:49.763706
running :2023-07-12 21:21:54.769737
running :2023-07-12 21:21:59.773836
  • 수동으로 AWS Credential 을 포함한 secret 을 생성 후 pod 에서 참조 성공
  • 프로그램 동작 명령을 전달하는 과정을 dockerfile 에서 k8s manifest 파일로 수정 후 동작 확인
  • aws credential 을 코드에서 분리 성공
  • hostpath Dir 를 PV 로 사용 성공
    • 마운트 시 /home 으로 하였을 때 기존 container 의 workdir 와 겹쳐 에러가 발생함
    • /home 디렉토리 안에서 경로를 서로 특정해 줘야 할듯 함