53ningen.com

@gomi_ningen's Website

Lambda 関数上で io-ts を利用すると例外発生時にタイムアウトする

※ 自分用メモです

  • 概要: Node.js 14 ランタイムの Lambda 関数でデプロイパッケージに io-ts が含まれていると、例外発生時に即時関数実行が停止せず、タイムアウトまで待ち時間が発生する

通常、以下のようなコードで簡単に例外を発生させ、関数実行を停止させられる

import 'source-map-support/register'

export async function handler(event: object, _: object): Promise<object> {
 throw Error()
}

ところが、以下のように io-ts を import しただけで例外発生時にタイムアウトまで待ち時間が発生してしまう

import * as t from 'io-ts'
import 'source-map-support/register'

export async function handler(event: object, _: object): Promise<object> {
 throw Erro...
Read More

Secrets Manager を使ってみる

Secrets Manager への値の格納と取得

チュートリアルに書いてある内容をためしてみる。CLI からまずはシークレットの作成を行う

$ aws secretsmanager create-secret --name tutorials/MyFirstSecret --description "Basic Create Secret" --secret-string S3@tt13R0cks

続いて格納したシークレットのメタデータ、およびシークレットそのものを取得する

$ aws secretsmanager describe-secret --secret-id tutorials/MyFirstSecret
{
    "ARN": "...",
    "Name": "tutorials/MyFirstSecret",
    "Description": "Basic Create Secret",
    "LastChangedDate": ...,
    "LastAccessedDate": ...,
    "Vers...
Read More

SAM で Step Functions リソースを定義する

これはなに

  • 2020/5/27 に SAM が Step Functions リソースをサポートしたので、リソース定義の流れを確認しておくメモ
  • シンプルな機能を持つ Lambda 関数を数珠つなぎにして、大きなアプリケーションを構成するときに Lambda から Lambda、あるいは Lambda, から SNS, SQS などを通して Lambda を起動するよりも、Step Functions を用いたほうがワークフローが明確で、処理の流れがコードを見ずに理解できる
  • ステートマシンから直接 DynamoDB テーブルの読み書きも可能なのでそのあたりのコード書かなくてすむのでやっぱりサーバーレスアプリケーションを構成するときにはかなり有用

Lambda 関数の作成

チュートリアルとして、ある関数 A が "Hello" と返し、関数 B は "World"...

Read More

SAM を利用して EFS ファイルシステムをマウントした Lambda 関数を作る

つい先日 Lambda で EFS のファイルシステムをマウントできるようになった らしいです。

SAM 側では AWS::Serverless::Function リソースが FileSystemConfigs というプロパティを追加してすでにこの機能に対応している らしいです。

また、これに関連して SAM のポリシーテンプレートに [EFSWriteAccessPolicy](https://github.com/awslabs/serverless-application-model/commit/b98e69c4c442c64c4bd40b1e41b4bb0dcb11283b#diff-b459a8d88303da927fe85516...

Read More

DynamoDB local と localstack の導入

DynamoDB local について

公式ドキュメント に記載されているように .jar ファイル形式で提供されていて、ダウンロードして手軽に使えます。

導入手順

以下のようにお手軽に利用可能

$ wget https://s3-ap-northeast-1.amazonaws.com/dynamodb-local-tokyo/dynamodb_local_latest.zip
$ unzip dynamodb_local_latest
$ java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
$ aws configure #=> 認証情報が空の場合は fake でもよいので設定しておく必要がある
$ aws dynamo...
Read More

SAM(Serverless Application Model) と Lambda Layers

以下のような内容を実現しようとしてみたメモ

  • Lambda の Layer も含めて同一の SAM file で管理したい
  • ステージごとに Layer も分離したい
    • 本番環境と開発環境の Layer は真面目に運用するなら分離したいところ
    • バージョンで分けるというのもあるけど、個人的にはそもそもリソースを分離したい

Directory 構造

以下のように Lambda 関数とレイヤを同一のリポジトリ、および SAM ファイルで管理します

.
├── config.dev
├── config.prod
├── config.template
├── deploy
├── src
│   └── python36
│       ├── hello_world
│       │   ├── __init__.py
│       │   ├── app.py
│       │   └── requirements.txt
│       └── layers
│           └── requests
│               ...
Read More

ALB のターゲットの Lambda 関数から Multi Value Headers を返す

複数値を持つ RequestHeader/ResponseHeader がたまにあります。通常こういったリクエストが来た場合でも Event オブジェクトの Headers はただ単純にマップでしかないので、同一キーに対して値は一つです。レスポンスもマップというデータ構造を使っているときには当たり前ですが、同一キーに対して値は一つです。

ALB のターゲットグループに対して lambda.multi_value_headers.enabled 属性を true とすることによりこれに対応できます。このオプションは以下のようなコマンドで変更可能です。

aws elbv2 modify-target-group-attributes \
  --target-group-arn <value> \
  --attributes <value>

このオプションに変更する際は Lambda 関数の実装自体も変更する必要があります。以下のように multiValueHeaders をキーとして Map<String, List<String>> というような構造となっていま...

Read More

twitter のストリーミングデータで遊ぶ

Twitter のストリーミングデータを Kinesis Data Stream に流し込み、Lambda にてバッチ処理する簡単な連携の方法をまとめておきます。慣れていれば 15 分で構築できます。ベンリ。

Kinesis Data Stream を作成する

以下のようなコマンドで簡単につくれます。

$ aws kinesis create-stream --stream-name tweets --shard-count 1

オプションで指定しているシャードとは以下のような概念となります。

シャード シャードは、ストリーム内の一意に識別されたデータレコードのシーケンスです。ストリームは複数のシャードで構成され、各シャードが容量の 1 単位になります。各シャードは 読み取りは最大 1 秒あたり 5 件のトランザクション、データ読み取りの最大合計レートは 1 秒あたり 2 MB と 書き込みについては最大 1 秒あたり 1,000 レコード、データの最大書き込み合計レートは 1 秒あたり 1 MB (パーティションキーを含む) をサポート...

Read More

Lambda で各種言語を試す

Lambda にて Ruby 2.5 がサポートされたのに加え、Bring Your Own Language Runtime という形でお好きな言語のランタイムの導入がサポートされました。各種言語での Hello, World を試しておきます。

目次

<a name="ruby25"></a>

Ruby 2.5

ランタイムとして Ruby 2.5 が選択できるようになっているので、その状態で Lambda 関数を作成します。

`...

Read More

Copyright © 53ningen.com