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'}
.
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
{
"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
{
"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.route('/', methods = ['GET'], cors = True)
Aktifkan otentikasi Cognito
Jika Anda ingin membatasi akses ke API dengan autentikasi AWS Cognito, tulis kode berikut.
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
app.py
Memisahkan 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.
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.
from chalice import Blueprint
extra_routes = Blueprint(__name__)
@extra_routes.route('/a')
def a():
return {'hello': 'a'}
from chalice import Blueprint
extra_routes = Blueprint(__name__)
@extra_routes.route('/b')
def b():
return {'hello': 'b'}
Modifikasi app.py
sebagai berikut
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
.
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.
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