본문 바로가기
AWS의 임베디드 이용

[AWS/임베디드] S3 Bucket을 이용한 펌웨어 업데이트 기능 구현 / Python

by 누워있는말티즈 2023. 7. 12.

오랜만에 티스토리로 돌아온 글은 AWS의 서비스를 임베디드 시스템, IOT 서비스에 가볍게 이용하는 요소들을 다루고자 한다. 첫 번째로 S3 Bucket을 이용한 펌웨어 업데이트 기능이다.

기존 소스들을 찾아본 결과 다 파일명을 알고 있어야 하던데 본 글에서는 최신 파일만 가져와 업데이트 하는 방향으로 구현하였다.


0. IAM 권한으로 Access Key 발급

외부 Python 으로 접근하기 위해서는 IAM 사용자 등록과 Access Key 발급이 필요하다. AWS 콘솔에서 IAM으로 이동한다.

https://us-east-1.console.aws.amazon.com/iamv2/home?region=ap-northeast-2#/home

 

https://us-east-1.console.aws.amazon.com/iamv2/home?region=ap-northeast-2#/home

 

us-east-1.console.aws.amazon.com

좌측에서 '사용자' 페이지로 이동한다.

사용자를 생성하고 [사용자 이름] -> [보안자격증명] 중단에서 액세스 키를 발급한다.

발급이 되었다면 이제부터 S3 Bucket을 작업한다.

1. AWS S3 Bucket 생성

사실 뭐 대단히 할건 없다.

https://s3.console.aws.amazon.com/s3/home?region=ap-northeast-2 

 

https://s3.console.aws.amazon.com/s3/home?region=ap-northeast-2

 

s3.console.aws.amazon.com

여기서 그냥 버킷 하나 만들고 이름만 알아두면 끝이다.

2. Python으로 S3 Bucket 접근하는 컨트롤러 구현

개인 취향으로 config 내용은 .ini 파일로 빼는 것을 좋아한다. 

config.ini 하나 만들어서 아래와 같이 정보를 적어둔다.

[AWS-ACCESS]
S3-bucket-name = bucket-name
S3-ACCESS-KEY = %%%%%%%%%%%%%%
S3-SECRET-KEY = ##################
S3-REGION = ap-northeast-2

Python으로 S3 Bucket에서 파일을 가져올 때는 boto3 라이브러리를 이용한다. pip으로 먼저 설치해준다. 겸사겸사 config.ini 이용하기 위한 configparser도 다운받아준다.

pip3 install boto3
pip3 install configparser

패키지 설치가 완료되었으면 기능하는 python 스크립트를 작성한다. 코드는 class로 묶어 사용성을 높였다.

import boto3, configparser

class S3_bucket_ctrl:
    def __init__(self) -> None:
        self.config = configparser.ConfigParser()
        config_read = self.config.read('../config/config.ini')

    def get_s3_client(self):
        s3 = boto3.client(
            's3',
            aws_access_key_id=self.config["AWS-ACCESS"]["S3-ACCESS-KEY"],
            aws_secret_access_key=self.config["AWS-ACCESS"]["S3-SECRET-KEY"],
            region_name=self.config["AWS-ACCESS"]["S3-REGION"]
        )
        return s3
        
    def download_from_s3(self)->None:
        self.s3_client = self.get_s3_client()
        
        self.response = self.s3_client.list_objects_v2(Bucket=self.config["AWS-ACCESS"]["S3-bucket-name"])
        self.all = self.response['Contents']
        self.latest = max(self.all, key=lambda x: x['LastModified']) # get latest file object

        self.save_file = '../firmware/' + self.latest['Key']
        self.s3_client.download_file(self.config["AWS-ACCESS"]["S3-bucket-name"],self.latest['Key'], self.save_file)

	
    def upload_to_s3(self, target_file) -> None:
    	self.s3_client = self.get_s3_client()
        self.local_fd = target_file
        self.bucket_fd = 'target bucket dir'
        
        self.s3_client.upload_file(self.config["AWS-ACCESS"]["S3-bucket-name"],self.local_fd, self.bucket_fd)
        
if __name__=="__main__":
    bucket = S3_bucket_ctrl()
    bucket.download_from_s3()
    bucket.upload_to_s3('../test/test.txt')

상당히 간단한 class이다.

(1) __init__()

config.ini의 내용을 불러온다. Key-value pair로 상수를 사용할 수 있어 애용하는 방법이다.

(2) get_s3_client()

boto3 client와 위에서 생성한 ACCESS KEY를 사용하여 AWS S3 Bucket 서비스 접근 client를 생성한다.

(3) download_from_s3()

bucket 내의 모든 파일에 대한 정보를 긁어온 뒤, lambda함수를 이용하여 'LastModified' key를 파싱하여 가장 최근에 업로드된 파일을 찾아내 원하는 로컬 저장소에 다운로드

(4) upload_to_s3()

해당 bucket에 파일 업로드

 

실행하면 아래와 같이 파일이 다운로드된다!


앞으로는 그간 진행한 프로젝트에 대해 포스팅을 해보도록 하겠다.

끝.

반응형

'AWS의 임베디드 이용' 카테고리의 다른 글

AWS EC2 서버 열기  (0) 2023.11.29

댓글