Traffine I/O

Bahasa Indonesia

2022-10-02

AWS Chalice

Apa itu AWS Chalice

AWS Chalice adalah kerangka kerja untuk mengembangkan aplikasi tanpa server yang berpusat pada Lambda, yang juga dapat mengotomatiskan integrasi dengan API Gateway, sehingga memudahkan untuk mengembangkan REST API. Ini juga dapat mengotomatisasi pengaturan untuk menggunakan AWS Lambda, seperti memicu dari peristiwa seperti S3 dan SQS.

Cara menggunakan AWS Chalice

Instalasi

Instal Chalice dengan perintah berikut.

$ pip install chalice

Siapkan kredensial AWS sesuai kebutuhan.

$ aws configure

Buat proyek Chalice bernama helloworld.

$ chalice new-project helloworld

File-file berikut ini dihasilkan oleh pembuatan proyek.

.
├── .chalice
│   └── config.json
├── .gitignore
├── app.py
└── requirements.txt

File-file penting di sini adalah app.py dan config.json. File app.py menjelaskan logika aplikasi, dan file config.json menjelaskan item-item konfigurasi aplikasi.

File app.py adalah sebagai berikut: mengakses API Gateway endpoint / dengan metode GET mengembalikan respon {'hello': 'world'}.

app.py
from chalice import Chalice

app = Chalice(app_name = 'helloworld')

@app.route('/')
def index():
    return {'hello': 'world'}

Pada saat pembuatan proyek, config.json terlihat seperti berikut ini

config.json
{
  "version": "2.0",
  "app_name": "helloworld",
  "stages": {
    "dev": {
      "api_gateway_stage": "api",
      "autogen_policy": true
    }
  }
}

Di stages Anda dapat mengatur lingkungan atau variabel lingkungan apa pun. Dalam autogen_policy Anda dapat mengatur apakah Chalice akan secara otomatis membuat role IAM. Jika Anda mengatur autogen_policy ke false, Anda dapat mengatur iam_policy_file ke path dari file policy yang Anda buat. Sebagai contoh, Anda dapat mengedit config.json sebagai berikut

config.json
{
  "version": "2.0",
  "app_name": "helloworld",
  "autogen_policy": false,
  "iam_policy_file": "custom-policy.json",
  "stages": {
    "dev": {
      "api_gateway_stage": "dev",
      "environment_variables": {
        "ENV": "dev"
      }
    },
    "prod": {
      "api_gateway_stage": "prod",
      "environment_variables": {
        "ENV": "prod"
      }
    }
  }
}

Eksekusi lokal

Anda dapat mengeksekusi proyek Chalice secara lokal dengan perintah berikut.

$ chalice local

Deploy

Anda dapat dengan mudah menyebarkan proyek Anda dengan perintah berikut. Jika perlu, Anda dapat memilih profil AWS atau stage yang dikonfigurasi dalam config.json.

$ chalice deploy
$ chalice deploy --profile chalice
$ chalice deploy --state dev

Setelah penerapan berhasil, resource berikut ini akan secara otomatis dibuat di AWS.

  • IAM role
  • Lambda function
  • API Gateway

Hapus resource

Untuk menghapus proyek Chalice yang telah diterapkan, jalankan perintah berikut.

$ chalice delete

Aktifkan CORS

Anda dapat dengan mudah mengaktifkan CORS dengan menambahkan cors=True ke app.py.

app.py
@app.route('/', methods = ['GET'], cors = True)

Aktifkan otentikasi Cognito

Jika Anda ingin membatasi akses ke API dengan autentikasi AWS Cognito, tulis kode berikut.

app.py
from chalice import CognitoUserPoolAuthorizer

authorizer = CognitoUserPoolAuthorizer("MyPool", provider_arns=[POOL_ARN])

@app.route('/', methods = ['GET'], authorizer=authorizer)

Kemudian, ketika Anda mengirimkan permintaan ke API, Anda dapat mengaksesnya dengan menambahkan token ID Cognito yang valid ke header Otorisasi.

Dekorator

Chalice dapat menggunakan dekorator untuk mengintegrasikan Lambda dengan layanan AWS lainnya. Pola-pola tersebut meliputi

  • AWS Lambda:@app.lambda_function
  • AWS Lambda + API Gateway :@app.route
  • AWS Lambda + Amazon CloudWatch Events:@app.schedule
  • AWS Lambda + Amazon S3:@app.on_s3_event
  • AWS Lambda + Amazon SQS:@app.on_sqs_message
  • AWS Lambda + Amazon SNS:@app.on_sns_message

Memisahkan app.py

Ketika mengembangkan API di Chalice, app.py menjadi membengkak seiring dengan bertambahnya ukuran program, yang menyebabkan produktivitas dan pemeliharaan yang buruk. Salah satu solusinya adalah dengan menggunakan fitur Blueprints Chalice, yang memungkinkan Anda untuk membagi app.py menjadi unit-unit sembarang.

Sebagai contoh, misalkan Anda memiliki app.py berikut ini.

app.py
from chalice import Chalice
app = Chalice(app_name='helloworld')

@app.route('/a')
def a():
    return {'hello': 'a'}

@app.route('/b')
def b():
    return {'hello': 'b'}

Sekarang app.py akan terpisah. Struktur direktori saat ini adalah sebagai berikut.

helloworld/
├── app.py
└── requirements.txt

Potong direktori sebagai berikut: Chalice mengharuskan modul-modul buatan sendiri untuk disimpan dalam direktori bernama chalicelib.

helloworld/
├── app.py
├── chalicelib
│   ├── __init__.py
│   └── blueprints
│     ├── __init__.py
│     ├── a.py
│     └── b.py
└── requirements.txt

Migrasikan endpoint dari app.py ke a.py dan b.py masing-masing.

chalicelib/blueprints/a.py
from chalice import Blueprint
extra_routes = Blueprint(__name__)

@extra_routes.route('/a')
def a():
    return {'hello': 'a'}
chalicelib/blueprints/b.py
from chalice import Blueprint
extra_routes = Blueprint(__name__)

@extra_routes.route('/b')
def b():
    return {'hello': 'b'}

Modifikasi app.py sebagai berikut

app.py
from chalice import Chalice
from chalicelib.blueprints.a import extra_routes as a    # 追加
from chalicelib.blueprints.b import extra_routes as b    # 追加

app = Chalice(app_name='helloworld')
app.register_blueprint(a)
app.register_blueprint(b)

Sekarang kita bisa membagi app.py!

Pengujian Chalice

Chalice menyediakan klien pengujian yang disebut chalice.test yang dapat digunakan untuk menguji aplikasi Chalice. Dengan klien ini, Anda dapat langsung memanggil fungsi Lambda dan event handler, serta menguji REST API.

Pertama, instal pytest dengan perintah berikut.

$ pip install pytest

Kemudian potong direktori sebagai berikut

helloworld/
├── app.py
├── tests
│   ├── __init__.py
│   ├── conftest.py
│   └── test_app.py
└── requirements.txt

Letakkan kode berikut di conftest.py.

tests/conftest.py
from typing import Generator

import pytest
from app import app
from chalice.test import Client

@pytest.fixture(scope="module")
def client() -> Generator:
    with Client(app) as c:
        yield c

Pada test_app.py, Anda akan menulis kode untuk pytest. Sebagai contoh, kodenya adalah sebagai berikut.

tests/test_app.py
from chalice.test import Client
from app import app

def test_helloworld(client: Client):
    response = client.http.get("/")
    assert response.status_code == 200

Anda bisa menjalankan tes dengan perintah berikut

$ py.test tests/test_app.py

========================= test session starts ==========================
platform darwin -- Python 3.7.3, pytest-5.3.1, py-1.5.3, pluggy-0.12.0
rootdir: /tmp/testclient
plugins: hypothesis-4.43.1, cov-2.8.1
collected 2 items

test_app.py ..                                                    [100%]

========================= 2 passed in 0.32s ============================

Referensi

https://aws.github.io/chalice/
https://aws.github.io/chalice/topics/blueprints.html
https://aws.github.io/chalice/topics/testing.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!