Flask &Zappa를 사용하여 서버 없는 마이크로 서비스 배포


간단한 소개👇
이 블로그에서 우리는 Zappa라는 훌륭한 배치 도구를 볼 것이다.우리는 3분 안에 AWS에서 Flask를 사용하여 서버 없는 마이크로 서비스를 배치할 것이다.사람의 마음을 감동시키다.
Google의 작은 마이크로 서비스는 API 단점으로 JSON 응답 형식으로 무작위 데이터 집합을 되돌려줍니다.source code here을 볼 수 있습니다.우리 시작합시다!

선결 조건:
  • AWS 계정
  • 필요
  • 개발 시스템의 AWS CLI 설정
  • Virtualenv
  • 설치

    자파가 뭐야?🔍
    Zappa는 AWS Lambda+API 게이트웨이에서 서버, 이벤트 구동 없이 파이썬 앱을 쉽게 구축하고 배치할 수 있는 도구다.
    파이썬 프로그램의 '서버 없음' 웹 트레이드로 볼 수 있습니다.즉, 무제한으로 확장되고, 다운타임이 전혀 없으며, 유지 보수가 전혀 없으며, 현재 배포의 일부에 불과합니다.

    프로젝트 작성✅
    우리가 해야 할 첫 번째 일은 Flask와 Zappa를 설치하는 가상 환경을 만드는 것이다.일을 질서정연하게 하기 위해서, 나는 나의 src 폴더를 추가하는 것을 좋아한다. 그 중에는virtualenv 폴더에 있는 응용 프로그램 파일이 포함되어 있다.
    $ virtualenv -p python3 persongenerator
    $ cd persongenerator && source bin/activate
    $ mkdir src && cd src
    $ pip install flask zappa
    
    상기 명령을 실행하면 app.py이라는 새 파일을 만들고 아래에 코드 세그먼트를 추가합니다.Flask 코드는 매우 간단합니다. 우리는 Flask 대상을 만들고 그 위에 루트 장식 함수를 추가했습니다. 이 함수는 우리의 경로를 정의합니다.이 예에서는 "/"이므로 홈 페이지입니다.
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return "Hello, world!", 200
    
    # This is for local development
    if __name__ == '__main__':
        app.run()
    
    flask run을 실행하고 브라우저 localhost:5000을 방문하여 Hello World 응용 프로그램이 정상적으로 작동하는지 확인할 수 있습니다
    좋아, 좋아, 일을 시작했어.배치할 때가 됐어!

    준비됐습니다.배포!🚀
    우선 이 애플리케이션에 AWS S3 버킷을 생성했는지 확인합니다.이 작업은 AWS 콘솔로 이동한 다음 위쪽 메뉴의 링크 서비스에서 수행할 수 있습니다.그런 다음 제목 저장소에서 S3 링크를 클릭합니다.
    버킷 만들기 단추를 누르고 버킷을 추가합니다.
    주의: 이 버킷은 정적 사이트가 아니기 때문에 사이트 파일을 포함하지 않습니다.그러니까 이 통은 공개할 필요 없어.나는 잠시 후의 게시물에서 왜 우리가 이 통을 필요로 하는지 설명할 것이다.
    프로젝트 루트 디렉터리에 zappa_settings.json이라는 새 파일을 만듭니다.이것은 기본적으로 우리의 자파 설정이다.
    {
        "dev": {
            "s3_bucket": "your_s3_bucket",
            "app_function": "app.app"
        }
    }
    
    이것은'dev'라는 환경을 정의합니다. (잠시 후'staging '과'production' 환경을 추가해야 할 수도 있습니다.)또한 배포할 S3 스토리지 통의 이름도 정의합니다.마지막으로 Zappa는 WSGI와 호환되는 함수를 가리키며 이 예에서는 Flask app 대상입니다.
    이제 우리는 배치할 준비가 되었다!잠깐만요.뭐?!😱
    네, 농담 아니에요.다음 명령을 실행합니다.
    $ zappa deploy dev
    
    우리의 마이크로 서비스는 아직 살아 있다.명령줄 프롬프트에 표시되는 URL 끝점은 무엇입니까?너무 빨라!🔥🔥
    그래.천천히.우리가 zappa deploy dev 명령을 실행할 때, 막후에서 도대체 무슨 일이 일어났습니까?

    자파장:
  • 은 Lambda와 호환되는 아카이브에 어플리케이션 및 로컬 가상 환경을 자동으로 패키지화하고 모든 종속 항목을 Lambda
  • 사전 컴파일된 버전으로 교체
  • 다음에 함수 처리 프로그램과 필요한 WSGI 중간부품을 설정합니다
  • 아카이브를 S3
  • 에 업로드
  • 필요한 Amazon IAM 정책 및 역할 작성 및 관리 및 새 Lambda 함수
  • 으로 등록
  • 새 API 게이트웨이 리소스를 작성하여 WSGI와 호환되는 라우트를 만들고 새 Lambda 함수
  • 에 링크
  • , 마지막으로 S3 스토리지 통에서 아카이브를 제거합니다.한디!
  • 이제 우리가 왜 그 S3통이 필요한지 알겠네.그것은 파일이 없기 때문에 배치의 임시 도구로만 사용된다.
    "Hello World"마이크로 서비스를 확장하고 다음 부분에 랜덤 인원 생성기를 만듭니다.

    랜덤 캐릭터 생성기 만들기👥
    우선 프로젝트 루트 디렉터리에 functions.py이라는 파일을 만듭니다.Flask 보기에 논리를 채우는 것이 아니라 프로그램에 논리를 추가할 것입니다.
    나는 구글을 시작해서 유행하는 이름과 성 목록을 검색했다.나는 first_name.txtlast_name.txt이라는 두 개의 텍스트 파일에 이런 내용을 추가했다.이 텍스트 파일은 Github repo에서 찾을 수 있습니다!
    그래서 이 텍스트 파일에서 무작위 이름을 선택하려면 작은 함수가 필요합니다. (무작위 이름과 성이 필요하기 때문입니다.)코드를 쓰겠습니다.
    import random
    
    def random_line(filename):
        with open(filename) as f:
            lines = f.readlines()
            return random.choice(lines).strip()
    
    이 함수는 파일 이름을 매개 변수로 하여 이름과 성 텍스트 파일을 반복해서 사용할 수 있습니다.그래서 우리는 파일을 열고 무작위로 한 줄을 선택해서 그것을 되돌려줍니다.나는 이름 뒤에 빈칸이 없도록 .strip()을 쳤다.
    좋아, 멋있어. 그래서 우리는 무작위 이름과 성씨를 얻을 수 있는 방법이 있어.현재 무작위 주소로 우리의 데이터 집합을 완성합니다.나는 인터넷에서 300개의 무작위 주소가 포함된 JSON 파일을 찾았다.형식은 다음과 같습니다.
    {
        "addresses": [
            {
                "address1": "1745 T Street Southeast",
                "address2": "",
                "city": "Washington",
                "state": "DC",
                "postalCode": "20020",
                "coordinates": {
                    "lat": 38.867033,
                    "lng": -76.979235
                }
            },
            {
                "address1": "6007 Applegate Lane",
                "address2": "",
                "city": "Louisville",
                "state": "KY",
                "postalCode": "40219",
                "coordinates": {
                    "lat": 38.1343013,
                    "lng": -85.6498512
                }
            }
            ......
        ]
    }
    
    그래서 우리는 이 그룹에서 무작위 주소를 얻기 위해 다른 함수를 작성해야 한다. 그리고 이 두 함수를 연결하는 최종 함수가 필요하다.
    이 코드는 매우 간단하기 때문에 기술적으로 말하자면, 우리도 하나의 함수에서 모든 코드를 작성할 수 있고, 심지어는 Flask 보기에 직접 쓸 수 있다.그러나 나는 코드를 작은 블록으로 나누는 것을 좋아해서 모든 내용을 다시 사용할 수 있고 오류가 발생하기 쉽다.응용의 크기를 막론하고 나는 이 원칙을 견지한다.
    알겠습니다. 파이썬 함수에서 JSON 파일을 열고 무작위 주소를 되돌려야 합니다.다음과 같은 코드를 사용할 수 있습니다.
    import random
    import json
    
    def random_address(filename):
        with open(filename) as f:
            data = json.load(f)
            random_address = random.choice(data['addresses'])
            return random_address
    
    우리 이전의 함수 같죠?따라서 우리는 JSON 파일을 열고 json.load을 호출합니다. 이것은 우리의 JSON을 Python 사전으로 변환합니다.random.choice으로 전화를 걸기 위해서 목록이 필요합니다.그래서 우리는 data['addresses']을 사용하여 우리가 원하는 형식을 얻을 수 있습니다. 마지막으로 우리는 우리의 무작위 주소로 돌아갑니다!
    마지막 함수를 계속합시다. 이 두 함수를 무작위 데이터 집중에 연결합니다.
    import random
    import json
    
    def get_random_person():
        data = random_address('address.json')
        data['firstName'] = random_line('first_name.txt')
        data['lastName'] = random_line('last_name.txt')
        return data
    
    여기에서 우리는 우선 무작위 주소를 얻어 변수 data에 저장합니다.이 변수는 우리의 사전을 포함한다.그리고 우리는 새 키를 하표로 사용하고 random_line() 함수를 사용하여 그 값을 분배하여 무작위 이름을 얻는다.마지막으로, 우리는 데이터를 되돌려줍니다.
    전체 functions.py 파일은 다음과 같습니다.
    import random
    import json
    
    def random_line(filename):
        with open(filename) as f:
            lines = f.readlines()
            return random.choice(lines).strip()
    
    def random_address():
        with open('address.json') as f:
            data = json.load(f)
            random_address = random.choice(data['addresses'])
            return random_address
    
    def get_random_person():
        data = random_address() 
        data['firstName'] = random_line('first_name.txt')
        data['lastName'] = random_line('last_name.txt')
        return data
    
    이제 업데이트 app.py 파일만 남았습니다.따라서, 여기에서 우리는 우리가 만든 함수를 가져오고, 우리의 마이크로 서비스에 추가 Flask 단점을 추가합니다.Flask에 내장된 jsonify을 사용하여 Python 사전을 올바른 JSON으로 변환합니다.
    from flask import Flask
    from flask import jsonify
    from functions import get_full_person
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return "Hello, world!", 200
    
    @app.route('/random-person')
    def get_person():
        data = get_full_person()
        return jsonify(data)
    
    # This is for local development
    if __name__ == '__main__':
        app.run()
    
    이제 남은 것은 다음 Zappa update 명령으로 서버가 없는 Lambda 함수를 업데이트하는 것입니다.이것은 자동으로 모든 코드를 업데이트합니다. 새 randomperson 단점은 dev/randomperson에서 사용할 수 있습니다.
    $ zappa update dev
    
    curl으로 빠르게 테스트해 보겠습니다.
    $ curl 'https://xdsk3y7413.execute-api.eu-central-1.amazonaws.com/dev/random-person'
    
    답변은 다음과 같습니다.
    {
       "address1":"8502 Madrone Avenue",
       "address2":"",
       "city":"Louisville",
       "coordinates":{
          "lat":38.1286407,
          "lng":-85.8678042
       },
       "firstName":"Jennifer",
       "lastName":"Jenkins",
       "postalCode":"40258",
       "state":"KY"
    }
    
    매우 매력적으로 일한다!😄

    결론⚡
    자, 이제 Flask와 Zappa를 사용하여 서버가 없는 마이크로 서비스를 배치하는 것이 얼마나 쉬운지 보실 수 있습니다!
    이전 블로그 글에서도 람다 함수를 검토했지만 자파와 같은 배치 도구는 100배 쉬워졌다.다음 단계는 저희 마이크로 서비스에 사용자 정의 영역을 추가하는 것입니다. 이것은 다른 글에서 소개할 것입니다.
    다음에 또 만나요!👋

    좋은 웹페이지 즐겨찾기