- 1. 【Rust】AWS LambdaでWebSocketクライアントにメッセージ送信
- 2. 【Rust】AWS LambdaでDynamoDB検索
- 3. [AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する①(概要説明)
- 4. AWS Lambdaの関数URL(Function URLs)のユースケースを真面目に考える
- 5. Pose検出するマイクロサービスを作成する
- 6. S3バケットに外部からファイルのやり取りを行う(期限付きURL)
- 7. [API Gateway→ Lambda] Lambdaでクライアント情報を取得してみました
- 8. AWSLamdbaのエフェメラルストレージ10GB拡張を試してみた
- 9. Redshift Data APIを使ってS3のJSONデータを取り込む
- 10. CloudFrontによる静的Webホスティング+署名付きURLの生成
- 11. LambdaでBasic認証掛けようとしたらLambda@Edgeが無い時
- 12. IoT CoreからAMP(Amazon Managed Service for Prometheus)へデータ登録するLambdaを作った話
- 13. 東京ドームのイベント情報をSlackに通知させてみた
- 14. LambdaでS3のファイルを読み書きする
- 15. Lambdaで画像分類AIをサーバレスAPI化して得た5つの知見
- 16. Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する③(実装説明)
- 17. API Gatewayを試してみた
- 18. LambdaからDynamoDBを操作する
- 19. Lambdaを定期実行する
- 20. Pythonの組み込みhash関数を使ってバグを作った話
【Rust】AWS LambdaでWebSocketクライアントにメッセージ送信
AWS LambdaをRustで実装する際のサンプルコードが少なすぎるのでメモ
# 内容
LambdaからAPI Gateway経由でWebSocketクライアントにメッセージを送信する。
送信先クライアントのコネクションIDは入力イベントやDBで動的に取得することが多いだろうが、ここでは簡易化のため固定とする。# コード
“`toml:Cargo.toml
[package]
name = “sample”
version = “0.1.0”
edition = “2021”[dependencies]
aws-config = “0.9.0”
aws-sdk-apigatewaymanagement = “0.9.0”
aws-types = “0.9.0”
http = “0.2.6”
lambda_runtime = “0.5.1”
serde_json = “1.0.79”
tokio = “1.17.0”
“`“`rust:main.rs
use aws_config::meta::region::RegionProviderChain;
use
【Rust】AWS LambdaでDynamoDB検索
AWS LambdaをRustで実装する際のサンプルコードが少なすぎるのでメモ
# 内容
DynamoDBの検索(スキャン)
例として、とある学校の生徒管理テーブルから指定した部活に所属する生徒の氏名一覧で取得することを考える。– テーブル名:students_table
– 項目1:name(氏名)
– 項目2:club(部活)# コード
“`toml:Cargo.toml
[package]
name = “sample”
version = “0.1.0”
edition = “2021”[dependencies]
aws-config = “0.9.0”
aws-types = “0.9.0”
aws-sdk-dynamodb = “0.9.0”
lambda_runtime = “0.5.1”
serde_json = “1.0.79”
tokio = “1.17.0”
“`“`rust:main.rs
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_
[AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する①(概要説明)
# この記事で解説することを3stepで
– **① CORS許可設定で「Access-Control-Allow-Origin」を「*」にせず、複数originを許可するOPTIONSメソッドをLambda関数で定義する。**
– **② その際にAWSコンソールを弄ってしまったらせっかくSAMで構築している意味が激減する(?)と思っているので絶対に弄らない。**
– いちいちPreflight用のOPTIONメソッドをコンソールからいじるのは面倒だし、SAMと後々競合とかしそうで怖い
– (確認はコンソールを見るのが手っ取り早いので見ます)
– **③ その他CORSに関する説明も交える**# 記事の構成
– [AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する①(概要説明)
– 本記事
– [[AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する②(シンプルな代案の説明)](https://qiita.com/sawa-akabee/ite
AWS Lambdaの関数URL(Function URLs)のユースケースを真面目に考える
AWS Lambdaに新機能 **Function URLs** が追加されました。
https://aws.amazon.com/jp/about-aws/whats-new/2022/04/aws-lambda-function-urls-built-in-https-endpoints/
https://aws.amazon.com/jp/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/
簡単にいうとAPI Gatewayなしに、HTTPSでのリクエストを受け付けられるようになるものです。
**API Gatewayなしで簡単になったよ!わーい!!** ではなく、今までできなかった何ができるようになったのかを真面目に考えてみました。
# Function URLsの認証
Function URLの認証は`IAM認証あり`と`認証なし`(パブリックアクセス)の二通りがあります。
IAM認証が使える環境であれば
Pose検出するマイクロサービスを作成する
# 概要
Pose検出するマイクロサービスを作成しようとしたところ、意外と苦戦したのでメモ。
Edgeの処理を軽くするため、サーバーサイド(Lambda)でMediaPipeを使用したPose検出を行うマイクロサービスを作成して呼び出そうとした。
# Dockerイメージの作成
Zipの制限に収まらないので、DockerイメージでLambda関数を作成する。
“`dockerfile:Dockerfile
# AWS提供ベースイメージ
FROM public.ecr.aws/lambda/python:3.8COPY app.py ${LAMBDA_TASK_ROOT}
RUN yum -y install mesa-libGL.x86_64 make gcc curl
COPY requirements.txt .
RUN pip3 install -r requirements.txt –target “${LAMBDA_TASK_ROOT}”# モデルをダウンロード
RUN mkdir -p //var/task/mediapipe/modules/
S3バケットに外部からファイルのやり取りを行う(期限付きURL)
### AWS外部から特定のS3バケットにあるファイルをダウンロード&アップロードを行いたい
S3の期限付きURLをLambdaにて生成し、URLにアクセスしファイルのダウンロード&アップロードを行う
(補足)
手動でやる場合は、Lambdaを使わずとも、S3バケットにて2クリック程で期限付きURLの作成ができます。
今回は、URLの生成を(ファイル検知などで)自動化したかっため、Lambdaにて作成しました。(やった手順)
① S3バケットの作成
② Lambdaの作成
③ Lambda(実行ロール)の設定
④ Lambda実行&ダウンロード&アップロード確認### ①S3バケットの作成
説明省略。普通に作るだけ。### ②Lambdaの作成
(URLをメールで連携したかったので…その処理も含まれています。)
(必要に応じて削除してください)詰まった点:generate_presigned_urlでURL生成しても、S3ファイルのパスにリージョンが含まれなかった。
・import from 設定
・boto3.client(‘s3’, config=Config(
[API Gateway→ Lambda] Lambdaでクライアント情報を取得してみました
場合によっては、Lambda Functionsでクライアント情報を取得する必要があります。
たとえば、クライアントのIPアドレスを確認します。API Gateway(Lambda Proxy)→ Lambda Functions(Golang)を構築してみました。
Lambdaで、APIGatewayを呼び出したクライアントの情報を取得しました。Golangのサンプルコード:
“`
package mainimport (
“context”
“fmt”
“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
)func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
strInfo1 := request.RequestContext.Identit
AWSLamdbaのエフェメラルストレージ10GB拡張を試してみた
# まえがき
普段サーバサイドエンジニアをしています。
今回はじめてQitaに記事を掲載します。# 概要
3/24のLambdaのアップデートにてエフェメラルストレージが最大10GBまで対応できるようになったため、実際に使ってみました。
https://aws.amazon.com/jp/about-aws/whats-new/2022/03/aws-lambda-configure-ephemeral-storage/元々Lambdaには「ファイルシステム」からEFSを設定することが可能でしたが、
VPCに接続する必要があったり、スループットが必要な案件ではかなり高価なEFSを使う必要がありました。# 設定
マネージメントコンソール上の「設定」から「一般設定」に「エフェメラルストレージ」が増えており、
こちらから更新すること可能ですが、既にServerless frameworkで対応されていましたので、こちらからデプロイしてみたいと思います。
※「エフェメラルストレージ」の機能を使用するにはServerless framework 3.10.0以上を使用する必要がありま
Redshift Data APIを使ってS3のJSONデータを取り込む
Redshiftへ取り込みたいデータがWeb APIでしか提供されていない場合にLambdaでAPIを叩いて取得したデータをRedshiftに取り込むということになると思います。今回はそのような実装したので紹介します。細い説明は省きます。
#### 1. Redshiftのデータベースとテーブルを作成する
#### 2. LambdaでRedshift Data APIを使ってS3にあるJSONデータをRedshiftに取り込む今回のアーキテクチャは以下の通りです
# IAM周りのセットアップ
#### 1. LambdaのIAMロールに「AmazonRedshiftFullAccess」ポリシーをアタッチする
#### 2. Redshift用のIAMロールを作成 & 「AmazonS3ReadOnlyAc
CloudFrontによる静的Webホスティング+署名付きURLの生成
# 目的
LambdaでCloudFrontの署名付きURLを生成し、S3オブジェクトのキャッシングを実装。
S3とCloudFrontの直接参照は不可とする。
## S3
– 新規でバケットを作成し、ファイルをアップロード
– アクセス許可:パブリックアクセスを全てブロック
– 静的ウェブサイトホスティング:無効## CloudFront
– 新規ディストリビューションを作成
– オリジンドメイン:作成したS3バケット
– S3バケットアクセス:
– OAIを使用(新規で作成)
– バケットポリシー:自動更新キーペアを生成後、「ビューアーのアクセスを制限する」を変更
## キーペアの作成
今回はOpenSSLで生成
“`
openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -in private_key.pem -out public_key.pem
“`public_keyをAWSにアップロード
– CloudFrontの左メニューから「パブリックキー」を選択
–
LambdaでBasic認証掛けようとしたらLambda@Edgeが無い時
東京リージョン(ap-northeast-1)だとアクションのプルダウンメニューにLambda@Edgeが表示されない
バージニア北部(us-east-1)で組み込むこと
IoT CoreからAMP(Amazon Managed Service for Prometheus)へデータ登録するLambdaを作った話
IoTデータをPrometheusに入れてGrafanaで見れたらおしゃれな気がする。理由はないけど。
しかーし
**IoT CoreのルールアクションにPrumetheusがない(泣)**
2022/4/3現在の指定できるアクションはこちら。

ないならLambdaで作ろうと思い立ち、作ったのがこちら。
https://github.com/moritalous/iot2aps-lambda
構成はこのようになります。

“`
$ npm i -g serverless
“`
or
“`
$ yarn add global serverless
“`# 実装
LambdaでS3のファイルを読み書きする
Lambda(Python)からS3へファイルをアップロードしたり、読み書きしたりすることがあったので書き記しておきます。
権限周りの話は以前こちらに書いてあるので参考にして下さい ↓↓↓
https://qiita.com/ymktmk/items/174ab4fecb14a0a3c7e0
## Client APIとResource APIの違い
https://aws.amazon.com/jp/sdk-for-python/
・Client APIはレスポンスが辞書型なので必要な情報を取り出しにくい
・Client APIはHTTP API 操作との 1 対 1 のマッピングが提供される
・Resource APIの方がオブジェクト指向っぽく書ける
・Resource APIが用意されていないことがあるサービスもある* Resource APIはresponse.bodyというようにオブジェクトを取得してから属性を参照できると書いてあったが自分はなぜかレスポンスが辞書型であった。よく分からない。
## S3にファイルをアップロードする
* 上書きするときもs3
Lambdaで画像分類AIをサーバレスAPI化して得た5つの知見
AWS上でAIを実現する場合は通常SageMakerを使いますが、軽量なモデルを使う場合であればサーバーレスで実現することもできると思い環境を構築しました。実際に構築することで得た知見を5つ紹介します。

以下のチュートリアルで作成した犬と猫を見分けるモデルを使用しました。
https://www.tensorflow.org/tutorials/images/classification?hl=ja
// 余談ですが、言語表示を英語にすると、犬と猫の識別ではなく、花の分類に題材が変わります。
# TenslorFlowのライブラリーはCPU版を指定する
Lambdaでの推論はCPUで行いますので、TensorFlowのライブラリーもCPU版を指定します。
また、内部で使用するKerasのバージョンも合わせておかないとエラーとなりま
Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する③(実装説明)
# この問題にぶつかるまでの経緯
– 単純でないリクエストでPreflightリクエストが送られるが、そこで特定の複数originからのリクエストのみパスさせたい
– 本番環境では特に `Access-Control-Allow-Origin: “*”` はだめなので…
– しかし、`Access-Control-Allow-Origin: “https:hoge.com,https:huga.com”` のような形式で複数のorigin を指定することはApiGatewayの仕様上できないらしい
– ではどうするか?次のように考えた
– PreflightリクエストはOPTIONS
– OPTIONSメソッドを自分で作ったLambda関数に統合して、定義したホワイトリストに合致するoriginからのリクエストだった場合パスさせるようにする# 記事の構成
– [[AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する①(概要説明)](https
API Gatewayを試してみた
# 背景・目的
– [LambdaからDynamoDBを操作する](https://qiita.com/zumastee/items/93f9301e7c8cea8883c0)で作成したLambdaをWebリクエストをもとに実行したい。
– 今回は、API Gatewayを使って実行する。
– 本ページでは、まずAPI Gatewayのチュートリアルを対象とし、実際に接続する方法は次回以降に試す。
# 概要
## API Gatewayとは
– REST、HTTP、WebSocketなどのAPIを作成、公開、維持、モニタリング、セキュア化するためのサービス
– 最大で数十万個の同時 API コールの受け入れ処理に伴うすべてのタスクを取り扱う## 特徴
– ステートフル (WebSocket) およびステートレス (HTTP と REST) API のサポート。
– 強力で認証メカニズム
– IAMポリシー
– Lambdaオーソライザー関数
– Cognitoユーザプール
– API発行するための開発者ポータル
– 変更を安全に進めるためのCanaryリリ
LambdaからDynamoDBを操作する
# 背景・目的
– 以前、「[VPC内のLambdaからインターネットに接続する](https://qiita.com/zumastee/items/21c77e66156a8d26856e)」と「[DynamoDBを試してみた](https://qiita.com/zumastee/items/ef8a5c855161f9e4ba92)」で作成したLambdaとDynamoDB(以降、DDBという。)を使用してQiitaの記事一覧を取得し、その内容をDDBに登録する。# 内容
## 前提
### DynamoDBテーブル
– DDBのテーブル名は「qiita_user_articles」、各項目は以下の通りとする。| 項目名 | キー/インデックス | タイプ| 例|
|:— | :—- | :—- | :—- |
| user_id | パーティションキー| 文字列 |test|
| article_id | ソートキー | 文字列 |00001|
| title | グローバルセカンダリーインデックス | 文字列|test title|
| url |
Lambdaを定期実行する
# 背景・目的
– [VPC内のLambdaからインターネットに接続する](https://qiita.com/zumastee/items/21c77e66156a8d26856e)で作成したLambda関数を定期的に実行する。
– 定期実行には、EventBridge Ruleを利用してみる。# 内容
## 実装
### 1. EventBridgeルールの作成
– EventBridgeのルールをクリックしトップ画面から、「ルールを作成」をクリックする。
### 2. ルールの詳細
– 名前と説明、イベントパス、ルールタイプ「スケジュール」を選択して「次へ」をクリックする。
 を元に識別子を計算したいと考えた。 その対策として、以下のようなコードを書いた。
“`python:バグありなのでこのコードは利用しないこと!
def primary_key(uid: str) -> str:
num = hash(uid) % 10
return f’SampleData.{num:02d}’
“`[`hash` 関数](https://docs.python.org/ja/3/library/functions.html#hash