AWS SAM에서 Lambda와 API Gateway를 배포해 보았습니다 (Python)

소개



지금까지 간단하게 Lambda를 만져 왔지만 AWS SAM을 사용하고 싶었기 때문에 시도했습니다.sam init 로 만든 README.md를 따릅니다.

환경


  • Windows 10
  • Python 3.6

  • 다양한 설치



    AWS CLI



    커맨드로 AWS의 각종 서비스 등을 사용할 수 있게 됩니다.
    설치 후 aws configure 에서 자격 증명을 설정합니다.
  • htps : // / cs. 아 ws. 아마존. 이 m/그럼_jp/cぃ/ぁてst/うせrぐいで/いんsたっ g. HTML
  • htps : // / cs. 아 ws. 아마존. 이 m/그럼_jp/cぃ/ぁてst/うせrぐいで/cぃーちゃーーp 껄껄 gs rd. HTML

  • 도커



    Docker를 설치합니다. 설치된 경우 다음!
  • htps //w w. 도 c r. 코m/

  • AWS SAM


    $ pip install aws-sam-cli
    
  • htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / ぁ mb다 / ㅁ st / dg / 음 mc ぃ くるりいれめん ts. HTML

  • 사용해보기



    샘플 작성


    $ sam init --runtime python3.6 --name sample
    [+] Initializing project structure...
    [SUCCESS] - Read sample/README.md for further instructions on how to proceed
    [*] Project initialization is now complete
    

    또한, runtime 부분을 바꾸면 다른 언어로 할 수 있습니다. (이하 sam init --help 보다)
     -r, --runtime [python3.6|python2.7|python|nodejs6.10|nodejs8.10|nodejs4.3|nodejs|dotnetcore2.0|dotnetcore1.0|dotnetcore|dotnet|go1.x|go|java8|java]
    

    필수 라이브러리 설치



    build 폴더 이하에 필요한 파일 등을 모으십시오.
    $ pip install -r requirements.txt -t hello_world/build/
    $ cp hello_world/*.py hello_world/build/
    

    로컬 테스트



    먼저 API를 시작합니다.
    $ sam local start-api
    

    다음으로 엔드포인트에 액세스합시다.
    $ curl http://127.0.0.1:3000/hello
    StatusCode        : 200
    StatusDescription : OK
    Content           : {"message": "hello world", "location": "xxx.xxx.xxx.xxx"}
    RawContent        : HTTP/1.0 200 OK
                        Content-Length: 57
                        Content-Type: application/json
                        Date: Sat, 11 Aug 2018 12:29:28 GMT
                        Server: Werkzeug/0.14.1 Python/3.6.3
    
                        {"message": "hello world", "location": "xxx.xxx.xxx.xx...
    Forms             : {}
    Headers           : {[Content-Length, 57], [Content-Type, application/json], [Date, Sat, 11 Aug 2018 12:29:28 GMT], [Se
                        rver, Werkzeug/0.14.1 Python/3.6.3]}
    Images            : {}
    InputFields       : {}
    Links             : {}
    ParsedHtml        : mshtml.HTMLDocumentClass
    RawContentLength  : 57
    

    움직였습니다! !

    런타임에 docker.errors.APIError: 500 Server Error: Internal Server Error ("b'Drive has not been shared'")라는 오류가 발생하면 아래를 참조하여 Docker 공유 설정을 수행합니다.
  • htp // 료이치 0102. 하테나 bぉg. 코m/엔트리/2017/01/26/134138

  • 패키징



    코드를 저장하는 S3 버킷을 만듭니다. 이미 있다면 다음!
    $ aws s3 mb s3://gnk263-lambda-bucket
    

    그런 다음 S3 버킷에 패키징합니다.
    $ sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket gnk263-lambda-bucket
    Uploading to 1729e204b620d03419b6ec4a99b8fac9  1047173 / 1047173.0  (100.00%)
    Successfully packaged artifacts and wrote output template to file packaged.yaml.
    Execute the following command to deploy the packaged template
    aws cloudformation deploy --template-file D:\xxx\yyy\packaged.yaml --stack-name <YOUR STACK NAME>
    

    배포



    그런 다음 배포합니다. 1분 정도 기다립니다. 웹 브라우저에서 CloudFormation에 액세스하면 움직이는 것을 볼 수 있습니다.
    $ sam deploy --template-file packaged.yaml --stack-name sam-sample --capabilities CAPABILITY_IAM
    Waiting for changeset to be created..
    Waiting for stack create/update to complete
    Successfully created/updated stack - sam-sample
    

    API Gateway 엔드포인트 얻기


    $ aws cloudformation describe-stacks --stack-name sam-sample --query 'Stacks[].Outputs'
    [
        [
            {
                "Description": "Implicit IAM Role created for Hello World function",
                "OutputKey": "HelloWorldFunctionIamRole",
                "OutputValue": "arn:aws:iam::yyyyyyy:role/sam-sample-HelloWorldFunctionRole-1RAI3BIXXK7RS"
            },
            {
                "Description": "API Gateway endpoint URL for Prod stage for Hello World function",
                "OutputKey": "HelloWorldApi",
                "OutputValue": "https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/"
            },
            {
                "Description": "Hello World Lambda Function ARN",
                "OutputKey": "HelloWorldFunction",
                "OutputValue": "arn:aws:lambda:ap-northeast-1:yyyyyyyy:function:sam-sample-HelloWorldFunction-10SCXHEFU9F2H"
            }
        ]
    ]
    

    동작 확인



    검색한 엔드포인트에 액세스해 봅니다.
    $ curl https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
    StatusCode        : 200
    StatusDescription : OK
    Content           : {"message": "hello world", "location": "xxx.xxx.xxx.xxx"}
    RawContent        : HTTP/1.1 200 OK
                        Connection: keep-alive
                        x-amzn-RequestId: c6a52235-9d77-11e8-9c19-e5ad43c51296
                        x-amz-apigw-id: Ldwi6G_UNjMFdTA=
                        X-Amzn-Trace-Id: Root=1-5b6efadf-18477a72e6ee65fc3d0b2342;Sampled=0
                        ...
    Forms             : {}
    Headers           : {[Connection, keep-alive], [x-amzn-RequestId, c6a52235-9d77-11e8-9c19-e5ad43c51296], [x-amz-apigw-i
                        d, Ldwi6G_UNjMFdTA=], [X-Amzn-Trace-Id, Root=1-5b6efadf-18477a72e6ee65fc3d0b2342;Sampled=0]...}
    Images            : {}
    InputFields       : {}
    Links             : {}
    ParsedHtml        : mshtml.HTMLDocumentClass
    RawContentLength  : 56
    

    성공했습니다!

    웹 브라우저에서 모습을 살펴보기



    s3



    상단



    버킷 안에



    API 게이트웨이



    상단



    상세



    람다



    상단



    CloudFormation





    참고


  • htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / ぁ mb다 / ㅁ st / dg / 하고 st- m-c ぃ. HTML
  • htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / ぁ mb다 / ㅁ st / dg / 세르 ゔ ぇ r ぇ s_ 아 p. HTML
  • htps : // / cs. 아 ws. 아마존. 이 m/그럼 _jp/ぁmb다/ぁ해서 st/dg/세르ゔぇrぇs-로 pぉyーwt. HTML
  • htps : // 기주 b. 이 m/아wsぁbs/세 rょぇrぇs-아 pぃ카치온-모로 l/bぉb/마s r/호 W와. md
  • 좋은 웹페이지 즐겨찾기