ラムダ関数のHTTP認証をAuth 0とAssemblyFile ( WebBassembly +ラムダ+ APIゲートウェイ+ Rust )


ああ、こんにちは!すみません、そこにお会いしませんでした.
あなたがここにいるので、話しましょうLambda 機能承認!
単独で、ラムダ関数が呼び出しを拒否する唯一の方法は、IAM方針です.これにより、AWS SDKを介してプログラムをプログラムから呼び出して別のサービスを防ぐことができます.しかし、ほとんどの場合、この方法で直接関数を呼び出すことは悪い習慣と見なされます.結合により、2つのサービス間で導入できます.
より良いアプローチは、HTTPAPI Gateway , と基本的な機能を実装の詳細にします.デカップリングに加えて、APIゲートウェイを使用すると、我々の機能を保護するためにOAuthなどのHTTP認証スキームを使用することができます!
Auth0 私たちはAPIのOAuth Authorizerを提供するために使用することができます高い評価(および使いやすい、個人的に話す)認証プラットフォームを提供しています.Autos 0は、7000人のユーザーを支持している自由な計画を提供します!
このガイドではAssemblyLift ラムダ関数を展開し、APIとAuthorizerを定義します.AssemblyLiftは、あなたが速く高性能Serverlessなアプリケーションを開発することができるオープンプラットホームです.サービス関数は、rustプログラミング言語で書かれ、webassemblyにコンパイルされます.AssemblyFill CLIは、必要なインフラストラクチャを構築し、展開するだけでなく、コードをコンパイルおよび配備することにも注意します!

準備と仮定
このガイドに従うにはAWS account あなたがすでに1を持たないならば.
また、必要がありますRust toolchain and NPM インストール.錆ツールチェーンはrustup インタラクティブインストーラ.インストール中の既定のオプションは罰金です.インストール後、インストールする必要がありますwasm32-unknown-unknown Rusts toolchainのビルドターゲットrustup toolchain install wasm32-unknown-unknown ).
したら、これらの前提条件を使用するとcargo install assemblylift-cli . ランasml help インストールを確認します.
⚠️ノート⚠️: あなたが以前AssemblyLiftをインストールしたならば、あなたが始める前に、あなたが最新版にいることを確認してください!バージョン0.3.2 このガイドに影響を与えるバグ修正が含まれています.🙂

仮定された知識
簡単な機能を書く予定ですRust は、DynamoDB テーブルは、あなたがさびに精通している必要があります(私たちのダイナモの使用法は非常に基本的になります).特に、あなたは快適でなければなりません.
このガイドはかなり簡単にする必要がありますが、我々はアセンブルリフトのいくつかのもう少し高度な機能を使用する予定です.これはAssemblyLiftを使用してあなたの初めての場合は、少し簡単です見てみることを検討.
また、Adobe IAMに慣れている必要があります.必要に応じてTerraform , プロジェクトコード内からこれらのアクセス許可を設定する方法も示します.😀

プロジェクト設定
お気に入りのプロジェクトディレクトリで、新しいAssemblyFillアプリケーションを作成し、そのディレクトリに変更します.
$ asml init -n auth-tutorial
$ cd auth-tutorial
を始めましょうdata サービスは、私たちはput 新しい項目をDynamoDBテーブルに追加できる機能.
新しいサービスと関数を生成します
$ asml make service data
$ asml make function data.put
AssemblyFillが新しいサービスを認識するためには、プロジェクトマニフェストに追加する必要がありますassemblylift.toml :
[project]
name = "auth0-tutorial"

[services]
data = { name = "data" }
あなたが好きなら、あなたはdefault マニフェストからのサービスだけでなく、services/ .

Auth 0 APIを作成する
AssemblyLift Projectの設定を基に、現在のところAutos 0で新しいAPIを作成するのに良い時間です.これはJWT認証を提供しますdata.put 関数.
Author 0のダッシュボードでアプリケーションのAPIに移動し、Create APIをヒットします.

署名アルゴリズムをRS 256として残し、APIに名前を付けます.識別子はOAuth 2.0でトークンを発行した認証サーバを識別するために使用されるユニークな文字列です.このAuthorizerに関連するエンドポイントのURLを使用することをお勧めしますが、あなたが好きな命名スキームを使用するには無料です!

設定data サービス
次はデータサービスマニフェストを開きましょうservices/data/service.toml , デフォルトの設定を次のように置き換えます.
# data/service.toml
[service]
name = "data"

[api.functions.put]
name = "put"
http = { verb = "PUT", path = "/put" }
authorizer_id = "auth0"

[api.authorizers.auth0]
auth_type = "JWT"

Authorizerの設定
エーJWT 最小の認可者audience and issuer パラメータ.オーディエンスは、あなたがあなたのAPIのために選んだ識別子です.発行者はフォームのURLになりますhttps://<tenant-id>.<region>.auth0.com . On 0コンソールの設定タブでテナントIDと領域を見つけることができます.
パラメータをauth0 定義
# data/service.toml
[api.authorizers.auth0]
auth_type = "JWT"
audience = ["your-identifier-here"]
issuer = "https://<tenant-id>.<region>.auth0.com"

データを書き込むput 機能
これは、実際に権威者によって保護されなければならない操作の例として、いくつかのデータをDynamoDBテーブルに書き込む比較的簡単な関数である😜
ダイナモに依存関係を追加する必要がありますIOmod . 依存関係はservice.toml :
# data/service.toml
[iomod.dependencies.dynamodb]
coordinates = "akkoro.aws.dynamodb"
version = "0.1.5"
また、貨物の依存性を追加する必要がありますput 関数.iomod依存性はiomodにAPIを提供する「ゲストcrates」と対をなします.CまたはC++プログラミング言語に精通している場合は、これをヘッダーファイルと同様に考えることができます.
# Cargo.toml
[dependencies]
assemblylift-iomod-dynamodb-guest = "0.1"
次に、関数コードを見てみましょう.見つけるput/src/lib.rs そして次のように更新します.
// data/put/src/lib.rs
extern crate asml_awslambda;

use asml_core::GuestCore;
use asml_awslambda::*;

use assemblylift_iomod_dynamodb_guest::{put_item, structs::*};

handler!(context: LambdaContext<ApiGatewayEvent>, async {
    let user_id = context.event.request_context
                .unwrap()
                .authorizer
                .unwrap()
                .claims
                .unwrap()
                .get("sub")
                .unwrap()
                .to_string();

    let mut input = PutItemInput::default();
    input.table_name = "auth0-tutorial".to_string(); // Change this to the name of your own DynamoDB table!
    input.item = PutItemInputAttributeMap::default();

    let mut pk_value = AttributeValue::default();
    pk_value.s = Some(user_id);
    input.item.insert(AttributeName::from("pk"), pk_value);

    match put_item(input).await {
        Ok(response) => http_ok!(response),
        Err(err) => http_error!(err.to_string()),
    }
});
この関数は PutItem アクション、認証されたユーザIDをテーブルに書き込むauth0-tutorial プライマリキーでpk . ユーザIDが主キーとして書き込まれます.これはユーザデータを追跡している本当のテーブルの場合です.
すべてのIOMOD呼び出しは、RUSTSFuture , サポートを与えるawait 構文!このアクションはinput structを構築し、HTTPレスポンスを返します.

関数のパーミッション
我々の機能がDynamoDBにアクセスするために、我々はアクセスを許す機能の実行役割にIAM方針をつけなければなりません.
残念なことに、これは現在のところアセンブルリフトtomlで直接扱われません(私たちは、私たちの時間がアセンブルリフトでどのようにパーミッションがモデル化されるかを分類しています)🙂). あなたのオプションは、AWS IAM console そして、そこにポリシーを追加するか、またはCLIによって生成されたコードを使用して独自のterraformコードを含めることができますAssemblyLiftの機能を使用することができます!
AssemblyLiftは特定の形式で指定された関数のIAMロールを生成しますasml-{project name}-{service name}-{function name} .
あなた自身のterraformは、アセンブリの中にterraformモジュールを追加することによってAssemblyLiftプロジェクトに含まれますuser_tf プロジェクトのルートでassemblylift.toml ).
そのようなモジュールの例は以下の通りです.
provider aws {
  region = "us-east-1"
}

data aws_caller_identity current {}
data aws_region current {}

locals {
    account_id = data.aws_caller_identity.current.account_id
    region     = data.aws_region.current.name

    prefix     = "asml-auth0-tutorial"
    table      = "auth0-tutorial"
}

data aws_iam_role data-put {
    name = "${local.prefix}-data-put"
}

data aws_iam_policy_document allow-dynamodb-put {
    statement {
      actions   = ["dynamodb:PutItem"]
      effect    = "Allow"
      resources = ["arn:aws:dynamodb:${local.region}:${local.account_id}:table/${local.table}"]
    }
}

resource aws_iam_policy data-put-policy {
    name   = "${data.aws_iam_role.data-put.name}-dynamodb"
    policy = data.aws_iam_policy_document.allow-dynamodb-put.json
}

resource aws_iam_role_policy_attachment data-put-policy {
    role       = data.aws_iam_role.data-put.name
    policy_arn = aws_iam_policy.data-put-policy.arn
}
テラフォームdata ルックアップ機能は、あなたのために作成された役割Assemblyliftをインポートするために使用されます.ここでの警告は、あなたが走る必要があるということですasml bind 少なくとも一度前に、このルックアップを追加するには、それを見つけるために!次のセクションをビルド&展開を参照してください!

ビルドと展開data サービス!
この部分はAssemblyliftでかなり簡単です!☺️
使用するcast コマンドを使用して関数コードをコンパイルし、terraform計画を生成します.その後、bind シリアル化されたコードを展開するコマンド&
走る前にbind , 実行中のすべてのプロセスの出力をチェックするcast 関数がコンパイルされたことを確認し、Terraformによって報告されたインフラストラクチャの変更が予期していないことを確認します.
$ asml cast
$ asml bind

関数認証のテスト
権限をテストする最も簡単な方法はcurl コマンドは、あなたのためにAuth 0ダッシュボードで生成されます!ダッシュボードのAPIのテストタブに移動します.探しているコマンドは以下の通りです.
curl --request GET \
  --url http://path_to_your_api/ \
  --header 'authorization: Bearer <TOKEN>'
APIのエンドポイントURLはAWS API Gateway console . この端点はdata サービス我々put 関数は、サービス定義tomlで定義されたパス(および動詞)です.
curl --request PUT \
  --url https://<api-id>.execute-api.<region>.amazonaws.com/put \
  --header 'authorization: Bearer <TOKEN>'
認証ヘッダなしでエンドポイントを呼び出すと、HTTP禁断のエラーが返されます.さもなければ、空のJSONオブジェクトでHTTP OKを返すべきです{} !
開けるDynamoDB web console を呼び出し、putitem呼び出しが動作したことを確認するあなたのオーサ0ユーザIDを持つアイテムがあるはずです!

それはすべて、人々!
あなたが質問をするならば、以下のコメントで手を伸ばすのを躊躇しないでくださいon GitHub !