Lambda関連のことを調べてみた2022年06月07日

Lambda関連のことを調べてみた2022年06月07日
目次

[AWS Lambda] Pythonで外部モジュール(Pillow)を使う

# AWS Lambdaで外部モジュールを追加する方法を情報まとめた
AWS Lambdaだと使えないライブラリ(モジュール)がありますね。追加が必要な場面がありますので外部モジュールの追加についてまとめます。

![amazon_awslambda_logo_icon_167887.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/f2d6c424-010e-6845-9656-63ee0a4e6716.png)

今回LambdaでS3にアップされた画像いじりたいのでで`Pillow`使おうとしました。
モジュールをzipでアップすればいいのは知っていたのでpip installでデータ取得できたらzipにしてOKでしょ!
と思ってテストを実行したら

“`
[ERROR] Runtime.ImportModuleError: Unable to import module ‘lambda_function’: No module named ‘PIL’
“`

とエラー。pip in

元記事を表示

ローカルにてLambda関数を組む二つ方法まとめ(VSCode,Pycharmなど)

方法としては下記の2種類です。

# 1、Dockerを利用してローカルで実行
手順は[この記事](https://qiita.com/zukakosan/items/9c01aba5ff537382c856)の通りですが、実際設定・実行する時は二つ問題が発見しました。
①VSCodeにの`app.py`ファイルには`Run Locally | Debug Locally | Configure`が表示せず、代わりに`AWS: Add Debug Configuration | AWS: Edit Debug Configuration`が表示しました。記事の[ここに書いている内容](https://qiita.com/zukakosan/items/9c01aba5ff537382c856#vscodeでlambdaをローカルテスト)と違います。なんか仕様変更らしいです。
`Add Debug Configuration`或いは`Edit Debug Configuration`をクリックしたら、`launch.json`デバッグ設定を追加しまして、`Edit SAM Debug C

元記事を表示

【boto3】API Gateway経由で一定時間以上起動しているEC2インスタンスを検知し、ユーザーに通知する

# はじめに

ご覧いただきありがとうございます。

業務の中でAmazon SageMakerを利用しているお客様と話すことがあります。
使用するノートブックインスタンスのスペックが高いので、起動し続けるとお金がかかります。

連続稼働時間を検知して自動通知を行えないかと試行錯誤する中で、そもそも普段使用しているEC2インスタンスの連続稼働時間を検知してユーザー通知する方法についても検討を行いました。

Lambdaを使用して「EC2インスタンスが一定時間以上稼働しているか確認して、1時間以上稼働していたらユーザー通知を行う」という検証を行ってみました。

# 概要

(★)がついているセクションは、手を動かして頂く項目です。

1. 今回の構成
2. 下準備(★)
3. EC2の連続稼働時間を検知するには?(★)
4. EC2をSysmtes Managerで扱えるようにする(★)
5. LambdaからEC2の連続稼働時間を取得する(★)
6. 稼働時間が一定時間を超えた場合、SNS通知を管理者に送る(★)
7. API Gatewayを経由した手動実行(★)
8. (おまけ

元記事を表示

平日に起動するLambda関数を作成してみた

## 概要

平日の営業時間は処理を実行したいが、土日祝日は処理を動かしたくないケースがあるかと思います。
そこで平日のみLambdaを実行し、土日祝日はLambdaを実行しないようにする構成をCloudFormationで作成します。

## 今回の構成を作成する前に

まずは、月~金に処理を実行し、土日は処理を実行しない場合の構成をCloudFormationで作成してみます。

### 構成
構成としては以下のようなシンプルな形になります。

![構成図-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/78cd9af3-d899-dd43-3133-902f7c0122a3.png)

### リソースの作成に使用するファイル
リソースの作成には以下のテンプレートを使用します。

“`template.yaml
AWSTemplateFormatVersion: ‘2010-09-09’
Description: “Periodic Execution Function Templ

元記事を表示

インターネットと通信するLambda関数はプライベートサブネットに配置する必要があるという一見矛盾した話

正確には「VPC内に配置したLabmda関数がインターネットと通信する場合」の話しです。
Lambda関数をVPC内に配置するときはこうしろっていうのは検索すればすぐ出てくるのですが、理由が書かれてない記事が多いので取り上げてみました。

## 背景
Security Hubを導入したところ準拠すべきセキュリティルールの中に「Lambda関数はVPC内に配置せよ」とあったので、適当なVPCの適当なパブリックサブネットに配置した。

## 事象
EC2を自動起動停止させるLambda関数が「Task timed out after XX.XX seconds」で動かなくなった。

## 対応1 (解決せず)
タイムアウトを伸ばしてみた。→解決せず
元々タイムアウト3秒で正常に動いていたが、エラーメッセージがタイムアウトなので30秒まで伸ばしてみたが、それでもタイムアウトする。

## 原因
今回言いたかったのはこれ。
実はLambda関数はパブリックサブネットに配置してもパブリックIPが払い出されないらしい。
AWSのドキュメントに下記の記述があった。

[VPC 内のリソースにアクセス

元記事を表示

lambda_runtimeのレスポンスオブジェクト作成に使えるクレートを作った話

ServerlessFramework のプラグインである [serverless-rust](https://www.serverless.com/plugins/serverless-rust) を使用して、API GatewayとAWS Lambdaを使ったAPIを作成しようとしていた。

Rustでラムダ関数を作成するのに便利なクレートはないだろうか?と調べたところ、[lambda_runtime](https://crates.io/crates/lambda_runtime) なるものを見つけた。
おおこれは便利だ、とサンプルコードをそのまま使用してみた。何かあれば修正してデプロイすれば良いし、無料枠を潰すほど実行することもないだろう。できればデプロイにかかる時間を有料枠で買えればよかったが…

[紆余曲折](https://qiita.com/mwataame/items/5247a1deb98e68561413)あったものの、serverlessコマンドで無事APIを作成することはできたようだ。
試しに実行してみよう。

“`
$ curl https://xx

元記事を表示

今さらRustランタイムを使用してAWS Lambdaで関数を作成してみたのだが…

### はじめに

– 基本的にAWSのラムダはRuby2.7ランタイムでServerlessFrameworkを用いてデプロイしている。
– Rust言語でラムダ関数をデプロイできると聞いていたものの試したことはなく、思い出したのでせっかうだから試してみたら、意外と躓いてしまった。
– 結果的に大した話ではなかったのだが、同じ沼にはまってしまっている人がいないとも限らないので残しておく。

### 実行環境

– Ubuntu20.04 on WSL2
– rustup 1.24.3 (ce5817a94 2021-05-31)
– cargo 1.56.0 (4ed5d137b 2021-10-04)
– serverless@3.4.0
– serverless-rust@0.3.8

# 普通にラムダ関数を作る

### コードの用意

AWSがRust向けのSDKを提供してくれているので、いつもお世話になっているrusotoではなく、lambda_runtimeというクレートを使用する。

“`toml:Cargo.toml
[package]
name = “lambda

元記事を表示

【AWS】関数URLを利用して外部からLambda関数を呼び出す

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民です♪
(/・ω・)/

2022年4月6日にLambda関数に「関数URL」という機能が追加されたようです。

https://aws.amazon.com/jp/about-aws/whats-new/2022/04/aws-lambda-function-urls-built-in-https-endpoints/

一言でいうと、API Gatewayの設定なしで外部からLambda関数を呼べるみたいです!
そこで今回は**Lambda関数の関数URLの使い方を説明したいと思います♪**
AWSについて勉強中の方の参考になれば幸いです。
(*^^)v

# 2.用語の説明
## 2.1.Lambdaとは
LambdaとはAWSのサービスの1つで、コードを書くだけで即実行ができるサービスのことです。
サーバの設定等が不要なため、便利です。

ただし、15分以上続けて実行することはできないため、
複雑なアプリケーションの場合はEC2やECRでの実行が必要となります。

# 3.前提条件
* Lambda関数が作成済で

元記事を表示

S3トリガのLambdaを作成する際の注意点について

## 事象
今回、AWS S3にファイルがputされたことをトリガに起動するLambdaを作成したのですが、ファイルサイズが大きいファイルを該当のS3バケットにアップロードした際にイベント通知がされずLambdaが起動しないというトラブルがありました。
その原因と対策を共有させて頂きます。

## 原因
そもそもS3には様々なイベント通知のタイプが存在します。

S3トリガのLambdaを作成する場合は、トリガーとしてS3バケットに対してどのようなアクションがあった時に通知を送るかを設定する必要があります。

今回の場合は、S3にファイルが配置(PUT)された時にLambdaを起動させたかったので、以下のPUTのイベントタイプを設定しました。

イベントタイプ:s3:ObjectCreated:Put

AWSのドキュメントを見て頂くと全てのイベント通知のタイプを確認できます。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/notification-how-to-event-types-and-destinati

元記事を表示

Lambdaの説明とlambdaのlayersの作り方

## lambdaとは

AWS Lambda は、サーバーレスでイベント駆動型のコンピューティングサービスであり、サーバーのプロビジョニングや管理をすることなく、事実上あらゆるタイプのアプリケーションやバックエンドサービスのコードを実行することができます。インフラストラクチャのプロビジョニングや管理をすることなくコードを実行コードを書いて、.zip ファイルやコンテナイメージとしてアップロードするだけです。

### サーバーレス

サーバーではなくて、その場でコードを実行する環境です、trigger(s3,SQSなど)で実行しても良い、定期実行もCloudwatchイベントからでも出来ます、サーバーと違って使ってる分だけを支払いします。同時実行も1秒で1000件まで出来ますのでインフラが楽です。

### 使い方

Lambdaを作るには割と簡単です!名前と言語とアーキテクチャを選べたらもうコード修正とテストが出来ます。

名前はエンドポイントになりますので気をつけてお名乗りください。

環境としては色々の言語は出来ます。

![Screen Shot 2022-05-27 a

元記事を表示

【AWS CDK】API GatewayからLambdaを通さずに直接DynamoDBにアクセスしGetItemするAPIを作ってみた

DynamoDBから値を取ってきて返すAPIを作成するにあたり、Lambdaを通さずに直接DynamoDBから値を取れることを知ったので試してみました。

## 作るもの
API GatewayからLambdaを通さずにDynamoDBに直接アクセスし、API Gateway + DynamoDBでgetItemするAPIを作成します。
今回は、`GET books/{title}`を叩くと以下のような形でDynamoDBに保存されている値を整形して返却してくれるようなAPIを作成していきます。

“`
{
“title”: “how_to_book”,
“price”: 1000
}
“`

## 構成
シンプルな構成です。
![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699394/f6843e74-d9fa-7672-cdd6-c58da1869fb4.png)

## 環境
“`
cdk –version
2.10.0 (build e5b301

元記事を表示

SpringBoot(+MyBatis)を用いてLambda + APIGatewayのAPIを製造する

SpringBootをLambda関数に実装してAPIGatewayでクライアント側から呼び出すAPIを製造する機会があり、何回か障壁にぶち当たったので、簡単な手順や注意点を備忘録としてまとめておくことにしました。
今回はMyBatisをORマッパーとして採用しましたが、JPAなどでも問題なく同様の手順で製造できるかと思われます。
バックエンド中心の話になります。

今回はAWS CodeStarでLambda+SpringBoot環境を自動生成しています。
 参考URL:https://qiita.com/ogu1101/items/b30a5ccbc28085462dff

# pom.xml
Codestarで自動生成されるJavaプロジェクトを使用したため、最初から何点か依存するライブラリの記述は書かれていましたが、私の方で以下を追加しました。

#### SpringBootのバージョンについて
今回自動生成されたプロジェクトのSpringBootのバージョンが2.0.3でしたが、2.3.0までアップグレードできることを確認しました。
2.4.0以上になると、デプロイ時に失敗

元記事を表示

Lambda Node ランタイム v12 → v14 update 備忘録

# はじめに
Lambda Node ランタイム v12が2022/04でサポートが終わるため、v14に更新しないといけないProjectが存在していました。
その際の手順として備忘録を残したいと思います。
ただ、本記事ではv14へ上げるというよりは、ランタイムのバージョンを上げる際にどういうことをやったのかを記載したいと思います。

# 環境
– ローカル環境端末
– macOS Big Sur
– AWS SAM CLI 
– Docker
– Lambda ソース環境
– AWS SAM で構築を実施
– ApiGateway & Lambda(TypeScript)を構築
– TypeScriptのためwebpackで実行ソースを作成(トランスコンパイル)している
– 利用しているnodeModules群はすべて最新のVersionに更新済み

# 手順
私の環境での対応としては以下の流れで実施しました。
1. AWS SAM Template.yamlでNodeRuntimeのVersionを更新
2. AWSアカウントにデプロイを実施
3. AW

元記事を表示

SQS、SNS、SNS+SQSからのイベントを比較してみた

## はじめに
業務でLambdaと組み合わせてSQSやSNSをよく使うのですが、イベントを正しくハンドリングする必要があります。
イベントの構造についてドキュメント等があるかもしれませんが、検証した方が早いと思い、自分で検証環境を作って確認してみました。

## 概要

以下によるイベントの構造をLambdaでログ出力して検証します。

– SQS
– SNS
– SNS + SQS

## 設定

### Lambda

以下のLambdaを作成し、イベントをログ出力します。
“`index.js
exports.handler = async (event) => {
console.log(`event: ${JSON.stringify(event)}`);
const response = {
statusCode: 200,
body: JSON.stringify(‘Hello from Lambda!’),
};
return response;
};
“`

### IAM
LambdaがSQSの

元記事を表示

Lambda 関数で EC2 インスタンス作成時にエンコードされた認証メッセージが出力された時の対処方法

権限が足りないのは明かです。ただ、Action, Resource がわからないので、対応できません。

エンコードされたメッセージをデコードすることにより、対応ができました。

“`
$ aws sts decode-authorization-message –encoded-message
“`

関数を作成した時に作成した Lambda の実行ロールに、最小特権のベストプラクティスに則り、一つ一つ出力されたものを追加していきました。

“`
…(snip)…
“Effect”: “Allow”,
“Action”: [
“ec2:“,
…(snip)…
],
“Resource”: [
“,
“,
“,
…(snip)…
]
“`

なお

元記事を表示

Lambda boto3 の run-instances でEBSボリュームを暗号化した時の嵌り

Lambda 関数で boto3 を利用時、run-instances を使用して EC2 マシンを作成する際にEBSボリュームを暗号化する設定を入れると、インスタンス起動してすぐに Terminate されてしまいました。

“`
…(snip)…
response = client.run_instances(
BlockDeviceMappings=[
{
‘DeviceName’: ‘/dev/xvda’,
‘Ebs’: {
‘VolumeSize’: 20,
‘VolumeType’: ‘gp3’,
‘KmsKeyId’: ‘xxxx-xxxx-xxxx-xxxx-xxxx’,
‘Encrypted’: True

元記事を表示

Amazon Lambda デプロイ&アップデート用のスクリプト(PowerShell)のテンプレ作ってみた

“`json:trust-policy.json
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Principal”: {
“Service”: “lambda.amazonaws.com”
},
“Action”: “sts:AssumeRole”
}
]
}

“`

deploy.ps1
“`powershell:deploy.ps1
#メモリはデフォルト
#Layer不要の場合
$NAME = “LAMBDANAME”

#Deploy用
Write-Output “————————————————————-”
$TIMEOUT = 60
$REGION = “us-east-1”
$ROLENAME = “ROLLNAME”
$HANDLERPATH = “main.FU

元記事を表示

S3トリガー(オブジェクト作成イベント)によるLambda実装の注意点

# 概要
Lambdaの開発時にS3トリガーとした実装を求められることもある。本記事は、S3トリガーを実装するときに注意すべき点を記載しておく。

# 実装イメージ
S3バケットのオブジェクトをトリガーにLambda関数が呼び出される
![s3_lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54819/a885b981-92a8-88f9-ebe7-b69e7ad06f94.png)

# S3トリガーによるイベントタイプ
– オブジェクトの作成イベント
– オブジェクトの削除イベント
– オブジェクトの復元イベント
– 低冗長化ストレージ (RRS) オブジェクトのイベントロスト
– レプリケーションイベント
– S3 ライフサイクルの有効期限イベント
– S3 ライフサイクルの移行イベント
– S3 Intelligent−Tiering 自動アーカイブイベント
– オブジェクトのタグ付けイベント
– オブジェクト ACL PUT イベント

馴染みのあるイベントはオブジェクトの作成イ

元記事を表示

AWS Lambda(Python)にインストールされているライブラリ一覧

# AWS Lambda(Python)にインストールされているライブラリ一覧

## 概要

AWS Lambdaはサーバーの管理を必要としないプログラム実行環境です。
API GatewayやCloudWatch Eventsなどをトリガーとして設定することで、非常に簡単かつ手軽にコードを動かすことが出来ます。
扱えるプログラミング言語としては、PythonやNode.js, Goなどメジャーな言語はだいたいサポートされていますが、ググって出てくる情報の多さからPythonが使われることが多い印象です。

そこで、Lambdaに用意されているPython実行環境にはじめからインストールされているライブラリとそのバージョンを調べたので、調べ方と合わせてまとめました。

## 調べ方

簡単です。
標準モジュールのpkg_resourcesを使うことで、その環境にインストールされているライブラリを一覧表示することができるので、これをLambada自体で実行するだけです。

“`python
import pkg_resources

def lambda_handler(

元記事を表示

APIGateway+Lambdaでミドルウェアを使う

# 背景

Go言語でlambdaを使ってサービス提供するときに、複数エンドポイント共通の処理を入れたくなった。
各エンドポイントに共通の処理を書き込むと、可読性が下がるためミドルウェアとして実装してみた。

参考:
https://github.com/mefellows/vesper
https://github.com/aws/aws-lambda-go/blob/main/lambda/handler.go

# 前提

`APIGatewayProxyRequest`と`APIGatewayProxyResponse`を利用している。

# 実装

いろいろと既存実装の制約あって`reflect`を利用してごちゃごちゃしているけど、実行速度考えたらできる限り`reflect`使わないで、エンドポイントのハンドラーの引数を`APIGatewayProxyRequest`、戻り値を`APIGatewayProxyResponse`に限定してあげた方がいいかも。

“` go
type LambdaFunc func(context.Context, events.APIGate

元記事を表示

OTHERカテゴリの最新記事