AWS Lambda + Serverless + Python  —  Покроковий посібник —  ч. 1 «Hello World»

10 хв. читання

Встановлення й налаштування віртуального середовища Python

Кроки встановлення будуть розписані для Ubuntu, Debian та дистрибутивів на основі Ubuntu/Debian. У разі, якщо ви користуєтесь іншими ОС, можете знайти більше інформації тут або на офіційному сайті Python.

sudo apt-get install python3
sudo apt-get install python3-pip
sudo pip3 install virtualenv
mkdir -p serverless-python-examples/hello-world/app
cd serverless-python-examples/hello-world

Створіть віртуальне середовище та активуйте його:

virtualenv -p python3 venv
. venv/bin/activate

Наша робоча тека:

serverless-python-examples/hello-world/app

Створення AWS користувача для вашого застосунку

Другим кроком буде вхід у консоль AWS й створення нового користувача (ви також можете використати вже наявного користувача):

AWS Lambda + Serverless + Python  —  Покроковий посібник —  ч. 1 «Hello World»

Додайте необхідні права для створеного користувача. Права Адміністратора (arn:aws:iam::aws:policy/AdministratorAccess) нададуть повний доступ до сервісів та ресурсів AWS.

Примітка: Коли річ стосується безпеки, права адміністратора не є кращим вибором. Ви можете налаштувати дозволи вашого користувача, обравши тільки ті AWS дозволи, які вам потрібні.

AWS Lambda + Serverless + Python  —  Покроковий посібник —  ч. 1 «Hello World»

Майте на увазі, що ви повинні завантажити згенеровані облікові дані й зберегти їх у безпечному місці:

AWS Lambda + Serverless + Python  —  Покроковий посібник —  ч. 1 «Hello World»

Для простоти я додав новий профіль до файлу:

~/.aws/credentials

з ім'ям

serverless
AWS Lambda + Serverless + Python  —  Покроковий посібник —  ч. 1 «Hello World»

Додавши облікові дані до облікового файлу AWS, можна використати будь-яку команду AWS, використовуючи бажаний профіль.

Приклад:

aws s3 cp my_file s3://my_bucket --profile serverless

Встановлення й налаштування фреймворку Serverless

Ви можете встановити Serverless, використовуючи команду:

sudo npm install -g serverless

Тепер налаштуємо Serverless:

serverless config credentials --provider aws --key <ACCESS KEY ID> --secret <SECRET KEY>

Якщо ви зберегли key/secret в обліковий файл, то можете використати будь-які команди Serverless, вказавши у кожній з них профіль.

serverless deploy --aws-profile serverless

Можна також експортувати профіль і регіон у змінні середовища:

export AWS_PROFILE="serverless" && export AWS_REGION=eu-west-1

Ініціалізація проекту

У теці застосунку вам потрібно створити файл serverless.yml. Цей файл потрібен для налаштування поведінки застосунку.

Також треба створити функцію Python (що називається handler.py):

Щоб це зробити, пропишемо команду:

serverless create --template aws-python3 --name hello-world

Це створить файл обробника, файл конфігурації та файл .gitignore:

.
├── .gitignore
├── handler.py
└── serverless.yml

Ось так виглядає наш файл serverless.yml:

provider:
  name: aws
  runtime: python3.6
functions:
  hello:
    handler: handler.hello

А так виглядає файл handler.py:

import json
def hello(event, context):
    body = {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "input": event
    }
response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }
return response
# Використовуйте цей код, якщо ви не користуєтесь подією http з LAMBDA-PROXY
    # Інтеграція
    """
    return {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "event": event
    }
    """

Розгортання нашого проекту

Як тільки будуть створені файли шаблонів, у нас буде робоча функція AWS Lambda. Нам потрібно її розгорнути:

export AWS_PROFILE="serverless"
serverless deploy

Примітка: вам потрібно змінити ім'я профілю на своє власне.

Вивід процесу розгортання виглядає таким чином. Ви можете бачити, що наш код архівується й розгортається у S3 bucket перед тим, як буде розгорнутим у Lambda.

Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (390 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
................
Serverless: Stack update finished...
Service Information
service: hello-world
stage: dev
region: us-east-1
stack: hello-world-dev
api keys:
  None
endpoints:
  None
functions:
  hello: hello-world-dev-hello

Функція розгорнута.

Додавання подій до нашої функції

Хоча у вас вже є функція, що називається hello, і яка пов'язана з обробником функцій, на даний час у вас немає способу її запустити. Ось чому нам потрібно додати event у визначення функції в serverless.yml. Оновіть її наступним чином:

Ми визначили функцію hello, але не визначили спосіб її запуску, ось коли корисно додати event. Відредагуйте файл serverless.yml:

provider:
  name: aws
  runtime: python3.6
functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get

Згідно з нашою конфігурацією, функція викликатиметься за допомогою ендпойнту /hello.

Примітка: ви можете обрати будь-який шлях замість цього.

Тепер розгорнемо:

serverless deploy -v
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (390 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - hello-world-dev
CloudFormation - CREATE_IN_PROGRESS - AWS::ApiGateway::RestApi - ApiGatewayRestApi
CloudFormation - UPDATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_IN_PROGRESS - AWS::ApiGateway::RestApi - ApiGatewayRestApi
CloudFormation - UPDATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::RestApi - ApiGatewayRestApi
CloudFormation - CREATE_IN_PROGRESS - AWS::ApiGateway::Resource - ApiGatewayResourceHello
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Permission - HelloLambdaPermissionApiGateway
CloudFormation - CREATE_IN_PROGRESS - AWS::ApiGateway::Resource - ApiGatewayResourceHello
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Permission - HelloLambdaPermissionApiGateway
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Resource - ApiGatewayResourceHello
CloudFormation - CREATE_IN_PROGRESS - AWS::ApiGateway::Method - ApiGatewayMethodHelloGet
CloudFormation - CREATE_IN_PROGRESS - AWS::ApiGateway::Method - ApiGatewayMethodHelloGet
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethodHelloGet
CloudFormation - CREATE_IN_PROGRESS - AWS::ApiGateway::Deployment - ApiGatewayDeployment1534113893559
CloudFormation - CREATE_IN_PROGRESS - AWS::ApiGateway::Deployment - ApiGatewayDeployment1534113893559
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Deployment - ApiGatewayDeployment1534113893559
CloudFormation - CREATE_COMPLETE - AWS::Lambda::Permission - HelloLambdaPermissionApiGateway
CloudFormation - UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - hello-world-dev
CloudFormation - UPDATE_COMPLETE - AWS::CloudFormation::Stack - hello-world-dev
Serverless: Stack update finished...
Service Information
service: hello-world
stage: dev
region: us-east-1
stack: hello-world-dev
api keys:
  None
endpoints:
  GET - https://x7o0xwsbkd.execute-api.us-east-1.amazonaws.com/dev/hello
functions:
  hello: hello-world-dev-hello
Stack Outputs
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:998335703874:function:hello-world-dev-hello:1
ServiceEndpoint: https://x7o0xwsbkd.execute-api.us-east-1.amazonaws.com/dev
ServerlessDeploymentBucketName: hello-world-dev-serverlessdeploymentbucket-qqgrblrjprhu

Як ви можете побачити у логах розгортання, в AWS lambda тепер нова URL:

https://x7o0xwsbkd.execute-api.us-east-1.amazonaws.com/dev/hello

Ми можемо протестувати нашу функцію за допомогою браузера, інструментів на зразок Postman, CLI або команди виклику Serverless.

Використання CURL:

curl -X GET https://x7o0xwsbkd.execute-api.us-east-1.amazonaws.com/dev/hello

Вивід:

{
   "message":"Go Serverless v1.0! Your function executed successfully!",
   "input":{
      "resource":"/hello",
      "path":"/hello",
      "httpMethod":"GET",
      "headers":{
         "Accept":"*/*",
         "CloudFront-Forwarded-Proto":"https",
         "CloudFront-Is-Desktop-Viewer":"true",
         "CloudFront-Is-Mobile-Viewer":"false",
         "CloudFront-Is-SmartTV-Viewer":"false",
         "CloudFront-Is-Tablet-Viewer":"false",
         "CloudFront-Viewer-Country":"FR",
         "Host":"x7o0xwsbkd.execute-api.us-east-1.amazonaws.com",
         "User-Agent":"curl/7.47.0",
         "Via":"1.1 xxx.cloudfront.net (CloudFront)",
         "X-Amz-Cf-Id":"",
         "X-Amzn-Trace-Id":"Root=1-5b70bbe0-f318b862a8dfdb1e38fc337e",
         "X-Forwarded-For":"",
         "X-Forwarded-Port":"443",
         "X-Forwarded-Proto":"https"
      },
      "queryStringParameters":null,
      "pathParameters":null,
      "stageVariables":null,
      "requestContext":{
         "resourceId":"bsk6aq",
         "resourcePath":"/hello",
         "httpMethod":"GET",
         "extendedRequestId":"LiJLDHe3oAMF7kQ=",
         "requestTime":"12/Aug/2018:22:59:44 +0000",
         "path":"/dev/hello",
         "accountId":"xxx",
         "protocol":"HTTP/1.1",
         "stage":"dev",
         "requestTimeEpoch":1534114784336,
         "requestId":"6727b590-9e83-11e8-a9cc-61641c6c77ac",
         "identity":{
            "cognitoIdentityPoolId":null,
            "accountId":null,
            "cognitoIdentityId":null,
            "caller":null,
            "sourceIp":"",
            "accessKey":null,
            "cognitoAuthenticationType":null,
            "cognitoAuthenticationProvider":null,
            "userArn":null,
            "userAgent":"curl/7.47.0",
            "user":null
         },
         "apiId":"x7o0xwsbkd"
      },
      "body":null,
      "isBase64Encoded":false
   }
}

Використання виклику serverless:

sls invoke -f hello

Вивід:

{
    "statusCode": 200,
    "body": "{\\"message\\": \\"Go Serverless v1.0! Your function executed successfully!\\", \\"input\\": {}}"
}

Хвостова частина логів

Іноді вам потрібно побачити логи виконання або розгортання. Ось команда для виводу хвостової частини логів:

sls logs -f hello --tail

Видалення функції

Використовуючи команду sls remove, ми можемо видалити розгорнуту службу з AWS Lambda.

serverless remove

Можна додати інші варіанти, наприклад:

  • --stage або -s Назва етапу в обслуговуванні.
  • --region або -r Назва регіону в обслуговуванні.
  • --verbose або -v Показує всі події стеку під час розгортання.

Примітка: видалення служби також видалить S3 bucket.

Ось і все. Ми побачили, як розгорнути нашу першу функцію Lambda за допомогою фреймворку Serverless.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.6K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація