목차
테스트 목적
- python 으로 동작하는 image build
- requirements.txt 파일 사용
- aws cli 동작 테스트
- 생성한 image를 사용한 pod 생성
- yaml 파일 사용해 apply 로 생성
- aws access-key / secret-key를 k8s secret 으로 저장 후 container 환경변수로 사용
aws cli credentail 을 kubectl secret 으로 생성해놓고 pod 를 정의하는 manifest 파일에서 컨테이너에서 환경변수로 사용할 수 있게 정의후 python boto3 패키지에서 사용할 수 있을지 테스트
1. 테스트 준비
1.1 docker image
python 이미지 사용
while 문을 사용해 일정시간마다 현재 시간을 기록하고 5분후 종료되는 간단한 앱
k8s secret 을 container의 환경변수로 저장할 예정, 이 환경변수를 사용한 aws configure 과 간단한 function test
1.1.1 test.py
aws-cli 로그인 및 동작 확인
import datetime
import boto3
import time
# .log 파일에 결과 기록
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()
# boto3 dynamodb table 읽기
def read_dynamoDB_table() :
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
logfile=open_logfile('stamp.log')
#1분동안 실행
start_time = datetime.datetime.now()
end_time = start_time + datetime.timedelta(minutes=1)
k,p=read_dynamoDB_table()
logs=str(k)+str(p)
write_and_flush_logs(logfile, logs)
while True :
dt_now = datetime.datetime.now()
logs="running :"+str(dt_now)
write_and_flush_logs(logfile, logs)
if dt_now > end_time :
close_logfile(logfile)
break
time.sleep(1)
1.1.2 requirements.txt
datetime
boto3
time 도 추가했었으나 에러가나서 확인해보니 python 에 기본적으로 제공한다고 한다
1.1.3 dockerfile
awscli 설치
aws configure 환경변수 리전 정보 저장
FROM python:3.10
RUN apt-get update && apt-get install -y \
awscli \
vim
ENV AWS_DEFAULT_REGION=ap-northeast-2
RUN mkdir /home/app
WORKDIR /home/app
COPY . .
RUN pip3 install -r requirements.txt
RUN nohup python3 test_app.py > stamp.log &
1.2 docker login (hub.docker)
빌드서버 (노트북) 에서 hub.docker repository 를 사용하기 위한 로그인
docker login -u cyaninn
Password:
WARNING! Your password will be stored unencrypted in /home/cyaninn/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
1.3 시크릿 생성
k8s secret 을 생성해서 container의 환경변수로서 사용하는 방법 테스트
https://kubernetes.io/ko/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod
명령어로 secret 생성
k create secret generic aws-configure \
--from-literal=accesskey='myaccesskey' \
--from-literal=secretkey='mysecretkey' \
-n test
1.4 test_pod.yaml
- apply 에 사용할 yaml file
- 빌드해서 사용할 이미지 이름 미리 정의해서 사용
- aws-configure 를 저장한 secret 을 환경변수로 포함
apiVersion: v1
kind: Pod
metadata:
name: 230615-test-pod
namespace: test
spec:
containers:
- name: test-container
image: cyaninn/test:1.1
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-configure
key: accesskey
optional: false
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-configure
key: secretkey
optional: false
restartPolicy: Never
2. image build/push
$ docker build --tag cyaninn/test:1.1 .
...
=> [6/7] RUN pip3 install -r requirements.txt 15.7s
=> ERROR [7/7] RUN python3 test_app.py > stamp.log 10.5s
------
> [7/7] RUN python3 test_app.py > stamp.log:
#0 8.632 Traceback (most recent call last):
#0 8.632 File "/home/app/test_app.py", line 43, in <module>
#0 8.632 k,p=read_dynamoDB_table()
#0 8.632 File "/home/app/test_app.py", line 23, in read_dynamoDB_table
#0 8.632 response = table.get_item(
#0 8.632 File "/usr/local/lib/python3.10/site-packages/boto3/resources/factory.py", line 580, in do_action
#0 8.632 response = action(self, *args, **kwargs)
#0 8.632 File "/usr/local/lib/python3.10/site-packages/boto3/resources/action.py", line 88, in __call__
#0 8.632 response = getattr(parent.meta.client, operation_name)(*args, **params)
#0 8.632 File "/usr/local/lib/python3.10/site-packages/botocore/client.py", line 530, in _api_call
#0 8.633 return self._make_api_call(operation_name, kwargs)
#0 8.633 File "/usr/local/lib/python3.10/site-packages/botocore/client.py", line 947, in _make_api_call
#0 8.633 http, parsed_response = self._make_request(
#0 8.633 File "/usr/local/lib/python3.10/site-packages/botocore/client.py", line 970, in _make_request
#0 8.633 return self._endpoint.make_request(operation_model, request_dict)
#0 8.633 File "/usr/local/lib/python3.10/site-packages/botocore/endpoint.py", line 119, in make_request
#0 8.633 return self._send_request(request_dict, operation_model)
#0 8.633 File "/usr/local/lib/python3.10/site-packages/botocore/endpoint.py", line 198, in _send_request
#0 8.634 request = self.create_request(request_dict, operation_model)
#0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/endpoint.py", line 134, in create_request
#0 8.634 self._event_emitter.emit(
#0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/hooks.py", line 412, in emit
#0 8.634 return self._emitter.emit(aliased_event_name, **kwargs)
#0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/hooks.py", line 256, in emit
#0 8.634 return self._emit(event_name, kwargs)
#0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/hooks.py", line 239, in _emit
#0 8.634 response = handler(**kwargs)
#0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/signers.py", line 105, in handler
#0 8.634 return self.sign(operation_name, request)
#0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/signers.py", line 189, in sign
#0 8.635 auth.add_auth(request)
#0 8.635 File "/usr/local/lib/python3.10/site-packages/botocore/auth.py", line 418, in add_auth
#0 8.635 raise NoCredentialsError()
#0 8.635 botocore.exceptions.NoCredentialsError: Unable to locate credentials
------
Dockerfile:14
--------------------
12 |
13 | RUN pip3 install -r requirements.txt
14 | >>> RUN python3 test_app.py > stamp.log
15 |
--------------------
ERROR: failed to solve: process "/bin/sh -c python3 test_app.py > stamp.log" did not complete successfully: exit code: 1
Unable to locate credentials 에러 확인
build 자체가 안되는 상황임
다른 방법으로 aws credential 을 정의해야 함
테스트 결과
- Unable to locate credentials 에러 확인
- build 자체가 안됨
- 다른 방법으로 aws credential 정의 필요
- 해결 방안
- aws kubernetes service account
위 방법 구성해보고 적용 테스트 필요
- 프로토타입 POD 배포
- 테스트 - aws credential 을 Dockerfile 에 환경변수로 선언해서 사용하는 임시 POD 배포
- 테스트 - k8s cronjob을 manifest 파일에 포함
- 배포 - 위 테스트 성공 시 정상 작동하는 pod 임시 배포
참고
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-envvars.html
'1인개발 메이킹로그 > [Infra+k8s+App] 가상화폐 자동매매' 카테고리의 다른 글
[테스트] Dockerfile 'CMD' / kubernetes cronjob (0) | 2023.06.19 |
---|---|
[Prototype-v1] 레거시 POD 배포 (0) | 2023.06.16 |
[AWS-Server] Troubleshooting - ModuleNotFoundError: No module named 'pyupbit' (0) | 2023.05.20 |
[AWS-Server] CICD Pipeline (0) | 2023.04.12 |
[AWS-Server] 6. S3 bucket 에 프로세스 로그 저장 (0) | 2023.04.07 |