APIゲートウェイのないHTTPSラムダエンドポイントの作成



AmazonのWebサービス(AWS)は、最近、Httpsのエンドポイントを介して機能を呼び出すことができます内蔵の機能をFunction URLsを発表した.既定では、エンドポイントはAWS Identity Access Management(IAM)を使用して安全ですが、オプションのクロスソースリソース共有(CORS)構成およびカスタム認証ロジックでパブリックアクセスを許可できます.元々、あなたがhttpsを通して公的にラムダ関数を起動したいならば、あなたは彼らの自由な層を超えたならば、AWS API GatewayまたはAWS Elastic Load Balancingを設定して、構成して、追加料金を支払う必要があります.幸いにも、関数URLは追加費用を発生しません🎉. あなたがServerlessなREST APIを構築しているか、要求応答transformationsのような追加機能を必要とするならば、あなたはこれらのサービスを使用し続けることを勧めます.webhooksのような小さなユースケースのために、または、暗号通貨の価格を決定するために、機能URLはより適しています.
このブログ記事は、関数URL、Python、およびTerraform、コードツールとしてオープンソースインフラストラクチャを使用して、HTTPSラムダエンドポイントを作成する方法を示します.terraformを使用したくない場合は、AWSユーザインタフェース(UI)を介して直接関数URLを作成できます.あなたは公式AWSガイドhereに従うことができます.原理が同じであるので、あなたはこのデモのためにAWSラムダと互換性のあるプログラミング言語を使用することができます.プロジェクトのソースコードをGithubに表示できます.

Pythonラムダ関数


まず、メインでPythonプロジェクトを作成します.λはλのエントリポイントである.私は、より簡単な実装のためにthis modern Python development environmentを使うことを勧めます、しかし、あなた自身は十分です.このプロジェクトはPythonバージョン3.9.0を使用します.サポートされているバージョンhereの一覧を表示できます.プロジェクトディレクトリ構造は次のように複製します.
.
├── .editorconfig
├── CHANGELOG.md
├── README.md
├── lambda_function_url_terraform
│   ├── __init__.py
│   └── main.py
├── poetry.lock
├── pyproject.toml
├── setup.cfg
└── tests
    ├── __init__.py
    └── test_main.py

2 directories, 10 files
この例では、メイン.Pyラムダハンドラは、メッセージとステータスコード200の本体を持つJSONオブジェクトを返します.

ラムダハンドラが確実にテストされていることを確認するには、Test/TestCount mainで単体テストを書きます.Pyの応答を検証します.

地形展開


すでにインストールされていない場合は、インストールしたofficial installation documentation.に従って、インストールを成功させることを確認します.

まず、必要な地形展開ファイルmainを作成します.あなたのPythonプロジェクトのトップレベルのtf.関数URLの機能が実装されている時から、1.0.0をTraraform Versionとして宣言し、Hashicorp AWSプロバイダーバージョンとして4.9.0を宣言します.マージ要求hereを確認することができます.次に、AWS領域、例えばEu - West - 1を宣言します.一度宣言されます.tfは次のようになります.

ラムダ関数を実装する前に、trust policyのIAMロールを作成する必要があります.この場合、AWSラムダサービスは信頼され、AWSセキュリティトークンサービス(STS)の前提となるアクションを呼び出すことができます.IAMロールリソースをメインに追加します.tfファイル.その実装は次のようになります.

次のコマンドを実行してパッケージと呼ばれるzipファイルを作成します.プロジェクトソースコードとそのラムダの要件を含むzip
# Install zip package to zip files/folders:
sudo apt-get install zip

poetry build; 
poetry run pip install --upgrade -t package dist/*.whl;
(cd package; zip -r ../package.zip . -x '*.pyc';)

# Pip installation without Poetry or zip:
pip freeze > requirements.txt
pip install -r requirements.txt -t package
# zip the package folder.
一旦ラムダ関数をパッケージ化するならば、実装される準備ができています.セットアップによっては、次の属性を変更する必要があります.
  • ランタイムは、Pythonのバージョンによって異なります.
  • function . nameラムダ関数を指定する名前.
  • ハンドラをLambda handlerへのパス.
  • ラムダ関数リソースは次のようになります.

    filename属性は、パッケージ化されたプロジェクトの拡張と一緒にファイル名です.同様に、SourceRank CodeRankハッシュ属性は、パッケージ化されたプロジェクトが更新されているかどうかを判断するために使用されます.role属性は、以前に実装されたIAMロールへのリファレンスです.ラムダ関数をmainに追加します.tf.
    最後に、関数URLリソースを作成し、生成されたURLを保存します.AuthorizationRange型はNoneに設定され、パブリックアクセスを許可します.認証されたIAMユーザーだけでなく、CORS構成機能へのアクセスを制限するオプションがあります.あなたはそれらについて読むことができますhere.ラムダ関数URLリソースは次のようになります.

    出力リソース関数のURLは生成された関数URLを保存します.関数URLと出力リソースの両方をメインに追加します.tf.すべてのterraformコンポーネントを一緒に、メイン.tfは以下のように複製します:
    < div >
    < br/> < br/> < br/>
    インフラストラクチャがコード化された後、TerraFormと共に展開することは単一のコマンドだけを必要とします、しかし、最初に、あなたはterraform initを実行することによってプロジェクトの中でterraformを初期化する必要があります.また、コマンドラインを介してAwsHand AccessLes Keychen ID、awsSense SecretTag AccessResキーとawsHand領域を設定します.AWS資格情報を設定することに慣れていない場合は、公式のAWSTerraformドキュメントについての詳細を読むことができますbr/> < br/>
    初期化されると、Tramform Applicationを使用してラムダ関数を展開し、必要な変更の確認を受け入れます.展開後、ラムダ関数URLを出力します🎉.


    <堀田>
    ブラウザでURLを開くか、のようなAPIテストツールを使用して、パブリックエンドポイントをテストします.以下の例では、terraformを使って、生成された関数URLをterraform outputを通して取得し、get requestをhttpieを使ってURLに送信します.p >
    <堀田>