AWSでのTODOリストのためのバックレスセットアップ


こんにちは👋, このポストで📝 私たちは、AWS servicesを使っているTODOアプリケーションのための単純なバックエンドを構築するつもりです☁️ AWS APIゲートウェイ、AWSラムダ、AWSダイナモなど.
DynamoDBを使用して、タスクのテーブルをハッシュ/パーティションキーとして設定します🔑. このテーブルは、4つのフィールドタスク、説明、日付と完了した(バイナリ)と簡単です.ハッシュキーを除いてテーブルを作成中にすべてのフィールドを指定する必要はありませんが、データをテーブルに追加しながらフィールドを動的に作成できます.

設定の残りをデフォルトにして、テーブルを作成します.
次に、IAMに行ってポリシーを作成します📃 これは、私たちのDynamoDBテーブルtodo上でCRUD操作を可能にします.私は、オハイオ州(US - Easts - 2)がテーブルがつくられた地域であるように、CrudohioDynamoTodoTableを方針名として設定しました.あなたは、方針を生成するためにこのsiteを訪問するかもしれません🚦. ポリシーJSONは以下の通りです.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Scan",
                "dynamodb:UpdateItem"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:dynamodb:us-east-2:<account-id>:table/todo"
        }
    ]
}

我々は今、役割を作成し、このポリシーを添付する必要があります.

ラムダとしてユースケースを選択し、次のページで作成したポリシーを選択します.

ロールの名前を選択します.

これまでの進歩:ラムダサービス役割> CRUD方針
IAMの部分を行うので、現在ラムダ関数を作成し、ロールをアタッチするのが良いです.関数名(. todo)を設定し、作成したロールに実行ロールを設定します.設定の残りのデフォルトにすることができます.

インデックスをコードに置き換えます.以下の関数を使ってJSを展開します.
const AWS = require("aws-sdk");

const dynamo = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event, context) => {
  let body;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json"
  };

  try {
    switch (event.routeKey) {
      case "DELETE /tasks/{task}":
        await dynamo
          .delete({
            TableName: "todo",
            Key: {
              task: event.pathParameters.task
            }
          })
          .promise();
        body = `Deleted task ${event.pathParameters.task}`;
        break;

      case "GET /tasks/{task}":
        body = await dynamo
          .get({
            TableName: "todo",
            Key: {
              task: event.pathParameters.task
            }
          })
          .promise();
        break;

      case "GET /tasks":
        body = await dynamo.scan({ TableName: "todo" }).promise();
        break;

      case "PUT /tasks":
        let requestJSON = JSON.parse(event.body);
        await dynamo
          .put({
            TableName: "todo",
            Item: {
              task: requestJSON.task,
              description: requestJSON.description,
              date: requestJSON.date,
              done: requestJSON.done ? true : false
            }
          })
          .promise();
        body = `New task added: ${requestJSON.task}`;
        break;

      default:
        throw new Error(`Unsupported route: "${event.routeKey}"`);
    }
  } catch (err) {
    statusCode = 400;
    body = err.message;
  } finally {
    body = JSON.stringify(body);
  }

  return {
    statusCode,
    body,
    headers
  };
};
ので、ラムダ関数は準備ができている.
ラムダ関数>ラムダロール> CRUDポリシー
次に何か、私たちのAPIであるラムダを呼び出すべきです.関連APIメソッドを使用して単一のAPIゲートウェイを作成しましょう.
コンソールのAPIゲートウェイに行って、ラムダ統合でHTTP APIをつくってください.

次はルート.

ゲートウェイは、デフォルト値に設定された他のプロンプトで作成できます.

実行中のURLを注意してください.
私は環境変数としてよりよく設定するつもりです、そのため、私はポストの残りのためにより長いURLを入力し続ける必要はありません.
$ executionURL=https://j6yotbi8ta.execute-api.us-east-2.amazonaws.com
うーん、それで、私たちのバックエンドは現在これでちょっとセットアップであると思います.
APIゲートウェイ>ラムダ関数>ラムダロール> CRUDポリシー
いくつかの呼び出しを行い、実際に動作するかどうかを見てみましょう.
$ curl -X PUT ${executionURL}/tasks -H "Content-Type: application/json" -d '{                        
"task": "BuyBooks",
"description": "Buy Java and System Design books from Amazon",
"date": "10-Apr-2022"
}'
"New task added: BuyBooks"

 $ curl -X PUT ${executionURL}/tasks -H "Content-Type: application/json" -d '{
"task": "ShutEC2Instances",
"description": "Shut down the unused EC2 instances to avoid billing",                                      
"date": "10-Apr-2022"              
}'
"New task added: ShutEC2Instances"
PUTメソッドを使用して2つの新しいタスクをうまく追加できました.
DBテーブルからすべての項目を取り出そう.
$ curl --silent ${executionURL}/tasks | jq                                                            
{
  "Items": [
    {
      "date": "10-Apr-2022",
      "task": "ShutEC2Instances",
      "description": "Shut down the unused EC2 instances to avoid billing",
      "done": false
    },
    {
      "date": "10-Apr-2022",
      "task": "BuyBooks",
      "description": "Buy Java and System Design books from Amazon",
      "done": false
    }
  ],
  "Count": 2,
  "ScannedCount": 2
}
そして今、我々のケースでは主キーに基づいてアイテムを取得します.
$ curl --silent ${executionURL}/tasks/BuyBooks | jq
{
  "Item": {
    "date": "10-Apr-2022",
    "task": "BuyBooks",
    "description": "Buy Java and System Design books from Amazon",
    "done": false
  }
}

$ curl --silent ${executionURL}/tasks/ShutEC2Instances | jq                                               
{
  "Item": {
    "date": "10-Apr-2022",
    "task": "ShutEC2Instances",
    "description": "Shut down the unused EC2 instances to avoid billing",
    "done": false
  }
}
タスクにカップル変更を行うことができます.最初のJavaはJavaScriptに置き換えられ、2番目のものはtrueとして設定されています.
$ curl -X PUT https://j6yotbi8ta.execute-api.us-east-2.amazonaws.com/tasks -H "Content-Type: application/json" -d '{
"task": "BuyBooks",
"description": "Buy JavaScript and System Design books from Amazon",                                                                                  
"date": "10-Apr-2022"
}'
"New task added: BuyBooks"

$ curl -X PUT https://j6yotbi8ta.execute-api.us-east-2.amazonaws.com/tasks -H "Content-Type: application/json" -d '{
"task": "ShutEC2Instances",
"description": "Shut down the unused EC2 instances to avoid billing",
"date": "10-Apr-2022", "done": "true"
}'
"New task added: ShutEC2Instances"
PUTメソッドは新しいアイテムを作成するか、既存の項目を置き換えます.これは、テーブルがちょっと小さいので、私たちの場合は結構です.その内容をもう一度見ましょう.
$ curl --silent https://j6yotbi8ta.execute-api.us-east-2.amazonaws.com/tasks | jq                                                                
{
  "Items": [
    {
      "date": "10-Apr-2022",
      "task": "ShutEC2Instances",
      "description": "Shut down the unused EC2 instances to avoid billing",
      "done": true
    },
    {
      "date": "10-Apr-2022",
      "task": "BuyBooks",
      "description": "Buy JavaScript and System Design books from Amazon",
      "done": false
    }
  ],
  "Count": 2,
  "ScannedCount": 2
}
curlコマンドを実行している間、それを文字列として設定したけれども、“done”の値はbooleanです、これはラムダ関数で以下のコードのためです.
done: requestJSON.done ? true : false
最後に、削除メソッド.
$ curl  -X DELETE ${executionURL}/tasks/ShutEC2Instances                                                                                                    "Deleted task ShutEC2Instances"

$ curl  -X DELETE ${executionURL}/tasks/BuyBooks
"Deleted task BuyBooks"
したがって、私たちはcurlから認証されていない呼び出しを送っていました.いくつかのセキュリティでは、すべてのルートにIAM Authorizerを追加できます.

これにより、我々は以前のような呼び出しを行うことができないはずです、我々は今認証され、認可される必要があります.
$ curl ${executionUrl}/tasks |  jq                                                                                       
curl: (3) URL using bad/illegal format or missing URL
AWSサインでそれからのそれを簡単に送る要求として、postmanを使いましょう.

資格情報が入力されたIAMユーザーは、APIゲートウェイへのAPI呼び出しを送信する許可を持つ必要があります.私の場合、ユーザIDは管理者権限を持っているので、それはうまくいきます.

まあ、このポストのためにそれ..👍 そこで、APIゲートウェイ、ラムダとIAMでミニTODOアプリケーションのバックエンドを設定する方法を見ました.そして、我々はcurl(out - out認証)とpostman(IAM認証付き)を介して、いくつかのAPI呼び出しでテストしました.
しかし、何が保留中であるかというと、私たちはいくつかの種類のウェブフロントエンドをAPIのゲートウェイにフェッチすることができました.
読んでくれてありがとう!使用していないリソースを削除するのを忘れないでください.