[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. 테스트 계획
- 기존 dockerfile 에 정의된 ‘CMD’ 를 제거한 후 build
- k8s secret 을 사용해 aws credential 정의 후 pod 의 container 에서 환경변수로 사용
- 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 디렉토리 안에서 경로를 서로 특정해 줘야 할듯 함
'1인개발 메이킹로그 > [Infra+k8s+App] 가상화폐 자동매매' 카테고리의 다른 글
[Error] .sh 스크립트 crontab 실행 안됨 (0) | 2023.10.01 |
---|---|
[Error] 'NoneType' object is not subscriptable (0) | 2023.09.24 |
[Project Report] 가상화폐 자동매매 + AWS lambda (0) | 2023.06.29 |
[Error] pod not completed (0) | 2023.06.25 |
[Error] string indices must be integers (0) | 2023.06.24 |