ひびきの技術メモ帳

駆け出しエンジニアのメモ帳

CDK&AWS Lambda お手軽API作成

こんなもの作れます

https://cgo3wctz6upknfwfyltvlrhsea0mpiyy.lambda-url.ap-northeast-1.on.aws/?text=konkoncha

ここにアクセスするとクエリに渡されたtextの文字をヒエログリフに変換して返してくれます

AWS CLIでアクセスキーなどを設定する

AWS CLIのインストール

brew install awscli

キーの設定

aws configure

アクセスキーなどを入力すると~/.awd/config/に登録されます

CDKのセットアップ

CDKのインストール

npm install -g aws-cdk

CDK用の作業ディレクトリ作成

mkdir ~/適当なディレクトリ/CDK用のディレクトリ && cd ~/適当なディレクトリ/CDK用のディレクトリ

※空のディレクトリじゃないとCDKの初期化コマンドが失敗します

初期化

cdk init app --langage typescript

CDKのデプロイに必要なディレクトリが作られます

.
├── README.md
├── bin
├── cdk.json
├── jest.config.js
├── lib
├── node_modules
├── package-lock.json
├── package.json
├── test
└── tsconfig.json

lambda用の処理を記述

import { Stack, StackProps } from "aws-cdk-lib";
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { FunctionUrlAuthType, HttpMethod } from "aws-cdk-lib/aws-lambda";

export class HieroRubyStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const url = new lambda.Function(this, 'MyFunction', {
      runtime: lambda.Runtime.RUBY_2_7,
      handler: 'main.lambda_handler',
      code: lambda.Code.fromAsset('./app'),
    });

    url.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE,
    });
  }
}

appディレクトリを作ってrubyの処理を記述

require 'json'

def lambda_handler(event:, context:)
    hash = { A: ["1313F"], B: ["130C0"] , C: ["133A1"], D: ["130A7"], E: ["131CB"], F: ["13191"], G: ["133BC"], H: ["1339B"], I: ["131CB"], J: ["13193"], K: ["133A1"], L: ["130ED"], M: ["13153"], N: ["13216"], O: ["1336F"], P: ["133E4"], Q: ["133D8"], R: ["1308B"], S: ["132F4"], T: ["133CF"], U: ["13171"], V: ["13191"],W: ["13171"], X: ["133A1", "132F4"], Y: ["131CB"], Z: ["13283"] }
    text = get_text(event)
    result = text && text.upcase.split("").map{ |string| hash[string.to_sym] ? hash[string.to_sym].map{ |s| s.hex.chr(Encoding::UTF_8)} : string }.join
    { statusCode: 200, body: result }
end

def get_text(event)
  if event["requestContext"]["http"]["method"] == "POST"
    JSON.parse(event["body"])["text"].to_s
  elsif event["requestContext"]["http"]["method"] == "GET"
    event["rawQueryString"].split("&").map{ |string| string.split("=") }.to_h["text"]
  end
end

クエリの受けとり方

event["rawQueryString"]で受け取れる

bodyの受け取り方

event["body"]で受け取れる

デプロイ

cdk deploy