AWS Lambda 함수 .NET 컨테이너를 Amazon DynamoDB에 연결

여러분, 안녕하세요! 이번 주에는 특히 .NET Container를 사용하여 AWS Lambda 함수를 배웠습니다. 내 게시물을 계속하고 더 많은 사용 사례를 확장합니다. 이전 Lambda 함수를 Amazon DynamoDB에 연결하겠습니다.

프로젝트 시작



this commit에서 프로젝트를 계속하십시오. 즉, this project을 사용하여 직접 탐색할 수 있습니다. 변경 사항을 확인하려면 here을 방문하십시오.

Lambda 함수 코드 업데이트



기존 프로젝트에 종속성 설치



사용하기 전에 Amazon DynamoDB 종속성을 설치해야 합니다. 다음 명령을 사용하십시오: dotnet add src/SimpleAPI/ package AWSSDK.DynamoDBv2 --version 3.7.3.57 . 버전3.7.3.57을 사용합니다.

모델 추가



이 모델 파일을 src/SimpleAPI/Models/Note.cs에 추가하십시오. 이 경우 개념 증명을 위해 간단한 모델을 사용합니다.

namespace SimpleAPI.Models;


using Amazon.DynamoDBv2.DataModel;

[DynamoDBTable("Notes")]
public class Note
{
    [DynamoDBHashKey]
    public Guid Id {get; set;}
    public String Message {get; set;}
} 

메모 컨트롤러 추가



API를 처리하려면 새 컨트롤러를 추가해야 합니다.

using Microsoft.AspNetCore.Mvc;
using Amazon.DynamoDBv2.DataModel;
using SimpleAPI.Models;
using Amazon.DynamoDBv2;

namespace SimpleAPI.Controllers;

[Route("api/[controller]")]
public class NotesController : ControllerBase
{
    private readonly AmazonDynamoDBClient _dynamoDBClient;
    private readonly DynamoDBContext _dbContext;
    public NotesController()
    {
        AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig();
        _dynamoDBClient = new AmazonDynamoDBClient(clientConfig);
        _dbContext = new DynamoDBContext(_dynamoDBClient);
    }

    [HttpGet]
    public async Task<IEnumerable<Note>> Get()
    {
        var notes = _dbContext.ScanAsync<Note>(new List<ScanCondition>());
        var results = await notes.GetRemainingAsync();
        return results;
    }

    [HttpGet("{id}")]
    public async Task<Note?> Get(Guid id)
    {
        var notes = _dbContext.QueryAsync<Note>(id);
        var results = await notes.GetRemainingAsync();
        return results.FirstOrDefault();
    }

    [HttpPost]
    public async Task<Note> Post([FromBody] Note value)
    {
        var batch = _dbContext.CreateBatchWrite<Note>();
        value.Id = Guid.NewGuid();
        batch.AddPutItem(value);
        await batch.ExecuteAsync();
        return value;
    }

    [HttpPut("{id}")]
    public async Task<IResult> Put(Guid id, [FromBody] Note value)
    {
        var notes = _dbContext.QueryAsync<Note>(id);
        var results = await notes.GetRemainingAsync();
        var first = results.FirstOrDefault();
        if (first == null)
        {
            return Results.NotFound();
        }
        first.Message = value.Message;
        var batch = _dbContext.CreateBatchWrite<Note>();
        batch.AddPutItem(first);
        await batch.ExecuteAsync();
        return Results.Ok(first);
    }

    [HttpDelete("{id}")]
    public async Task<IResult> Delete(Guid id)
    {
        var notes = _dbContext.QueryAsync<Note>(id);
        var results = await notes.GetRemainingAsync();
        var first = results.FirstOrDefault(); if (first == null)
        {
            return Results.NotFound();
        }
        var batch = _dbContext.CreateBatchWrite<Note>();
        batch.AddDeleteItem(first);
        await batch.ExecuteAsync();
        return Results.Ok();
    }
} 

Terraform 코드 업데이트


  • 람다의 실행 역할에 이 권한을 추가해야 합니다.

  • inline_policy {
        name = "lambda-custom"
        policy = jsonencode({
          Version = "2012-10-17"
          Statement = [{
            Effect = "Allow"
            Action = [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
            ]
            Resource = "*"
            }, {
            Effect = "Allow",
            Action = [
              "dynamodb:DescribeTable",
              "dynamodb:GetRecords",
              "dynamodb:GetShardIterator",
              "dynamodb:ListTables",
              "dynamodb:Scan",
              "dynamodb:Query",
              "dynamodb:BatchWriteItem",
              "dynamodb:PutItem",
              "dynamodb:UpdateItem",
              "dynamodb:DeleteItem"
            ]
            Resource = ["*"]
        }] })
      }
    

  • 또한 API를 호출할 때 종료되지 않도록 시간 제한을 연장합니다.

  •   tracing_config {
        mode = "Active"
      }
    
      timeout = 60
    

  • aws_lambda_function_url가 이미 모든 방법을 허용하는지 확인하십시오.

  • allow_methods = ["*"]
    

  • Amazon DynamoDB 리소스를 추가합니다.

  • resource "aws_dynamodb_table" "lambda_container_demo_dev" {
      name           = "Notes"
      billing_mode   = "PROVISIONED"
      read_capacity  = 20
      write_capacity = 20
      hash_key       = "Id"
    
      attribute {
        name = "Id"
        type = "S"
      }
    
      attribute {
        name = "Message"
        type = "S"
      }
    
      global_secondary_index {
        name               = "NoteMessageIndex"
        hash_key           = "Message"
        write_capacity     = 10
        read_capacity      = 10
        projection_type    = "INCLUDE"
        non_key_attributes = ["Id"]
      }
    
      ttl {
        attribute_name = "TimeToExist"
        enabled        = true
      }
    
      tags = {
        Name        = "dynamodb-table-1"
        Environment = "dev"
      }
    } 
    

    완료!




    bervProject / 람다 샤프


    Lambda는 C#(.NET) 도커 이미지를 사용합니다.





    Lambda 샤프 데모


    Lambda Containerized .NET 데모

    특허


    MIT


    View on GitHub


    리소스가 프로비저닝되도록 코드를 Amazon ECR에 배포하고 실행terraform apply할 시간입니다.

    Notes 기능의 CRUD를 테스트하기 위해 이 스크린샷을 볼 수 있습니다.
  • 모든 메모 가져오기


  • 메모 만들기


  • 메모 업데이트


  • ID로 메모 가져오기


  • 삭제



  • 고맙습니다!



    그래서 당신은 어떻게 생각하십니까? 아주 간단하죠? 당신의 생각을 공유합시다!

    좋은 웹페이지 즐겨찾기