Lambda関連のことを調べてみた

Lambda関連のことを調べてみた
目次

【Lambda】ReportLabで任意のフォントを使用してS3に格納する

## はじめに

PythonでPDFを生成するライブラリ[ReportLab]で、
標準選択できるフォント以外のフォントを使う際に一筋縄では出来なかったので、
解決方法を残します。

Lambdaのデプロイは[AWS SAM][aws-sam]を使っています。他の方法でもやり方は同じです。
LambdaやLambda Layerのデプロイ方法については本記事では解説しませんので、他の記事を参照ください。

## 解決コード

任意のフォントを登録→最終的にS3にプットするまでのコードです。
コードだけ知りたい、という方はこちらを参考にしてください。

“`python
import io

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.units import mm
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas

im

元記事を表示

Lambdaからタイムアウト時間を取得する

### Lambdaからタイムアウト時間を取得する
以前実装した内容でLambdaからとあるAPIを呼び出すというものがありました。
そのAPIは返答に時間がかかる場合があり、Lambdaのタイムアウト時間を超過してしまうこともあり、対策を打ちました。
対策としてはLambdaのタイムアウト時間に到達する前にカスタムのエラーを出力するようにしました。ここでLambdaのfunction内でタイムアウト時間を取得する必要があったので共有します。

### 実際のコード
* 呼び出される側
`LambdaClient`と`GetFunctionCommand `を使用してLambdaの情報の詳細を取得していきます。
※`rccApiError`はカスタムのエラーなので気にしないでください
`getLambdaDetails`関数でLambda関数の詳細を取得しますが、取得する際にLambdaの関数名を与えます。
後は`send`コマンドを使った結果をreturnします。
“`javascript
const { LambdaClient, GetFunctionCommand } = r

元記事を表示

AWS Lambdaへのデプロイにマルチステージビルドのコンテナイメージを使う【Ruby】

# はじめに
AWS LambdaへRubyのコードをデプロイする時にマルチステージビルドのコンテナイメージを使ったので、そのサンプルを紹介します。

# やりたかったこと

– RubyのコードをAWS Lambdaにデプロイしたい
– Dockerコンテナイメージをアップロードしてデプロイしたい
– Gemネイティブエクステンションを使いたい

# エラーが出た

AWS Lambda向けに、AWSのRubyベースイメージを使ってbundleインストールしたらエラーが出た。

“`shell
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
“`
**Gemネイティブエクステンションのビルドに失敗**

# 解決方法

Dockerのマルチステージビルドを使います。

:::note info
Gemネイティブエクステンションを使わないのであればマルチステージビルドは不要
:::

# Gemネイティブエクステンションとは?
Gemのコードの中に、Rubyで書かれた部分と、CやC++などのネイテ

元記事を表示

Terraform ✖️ Lambda credential管理

こんにちは!
25卒で現在はスタートアップのSRE部署でインターンをしている大学生です。
先日TerraformでLambda環境を作成する際に、credential管理について色々検討し、自分の中での落とし所を見つけたのでアウトプットしたいと思います。
ローカル環境もある程度忠実に再現できますので、誰かの役に立てたら幸いです。

最初に具体的な方法を語り、後半になぜこのような方法に至ったかについて、別の方法と比較検討しつつ解説したいと思います。

## 前提知識

– Terraformの基礎 (コード例見れば知識なくてもわかるかも)
– Lambdaの基礎

## アプリケーション概要

一応今回解説対象として作成したアプリケーションの概要について記載しました。
スキップしてもあまり問題ありません。

### Github Link

ローカル環境の構築する際に参考になればと思います。
Readmeに手順書いています。

https://github.com/yuta-2001/go-no-commit-notify

### 構成図
![スクリーンショット 2024-08-24

元記事を表示

CDKを使ってLambdaFunctionとLayerを一気にデプロイする

# 前書き
個人開発や技術検証で、試行錯誤しながらとにかく手を動かしたいとき、デプロイをもっと簡単にしたいと考えています。
Lambdaのランタイムをイメージにする方法もありますが、スクリプトを作成せず、コマンド一発でイメージをビルドし直し、ECRにプッシュするなど、スムーズに処理できる方法がなかなか見つかりません。もし、良い方法があれば教えていただきたいです。

現状はFunctionとLayerを分ける形で対応していますが、これはあくまで妥協案です。とはいえ、一応使える状態にはなっています。

# 手順

AWS CDK プロジェクトのセットアップ
“`shell
mkdir my-lambda-project
cd my-lambda-project
cdk init app –language=typescript
“`

`aws-lambda` と `aws-lambda-python-alpha` ライブラリをインストールします。

“`
npm install aws-cdk-lib @aws-cdk/aws-lambda-python-alpha
“`

元記事を表示

LambdaとAPI Gatewayを用いて, S3にpdfファイルをアップロード& BedRock ナレッジベースを同期

LambdとAPI Gatewayを用いて、S3にファイルをアップロードし、Amazon BedRockのナレッジベースの同期を行ったので、備忘録としてまとめます。クライアントがファイルをアップロードして、それを基にRAGできるようになります。

# ナレッジベースの作成
1. S3 > バケットを作成

1. AmazonBedRock > ナレッジベース > ナレッジベースを作成

1. Choose data sourceでAmazon S3を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879374/eaf70bc9-3ec9-e463-6e2f-1e0ae559b5ca.png)
1. 「s3を参照」から先ほど作成したS3をデータソースとして選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879374/efd4da91-7f34-3af7-352f-4203

元記事を表示

【AWS,Python】LambdaとAPI Gateway でJSONを返すAPIを作る

# API Gatewayを使ってAPIを作成する

![Screenshot 2024-09-06 130825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/6079dc08-288a-0198-989a-d6fd0ccfbdad.png)

LambdaでJSONファイルを作成する関数がすでにあるので、この関数を利用してAPIを作成します。

https://qiita.com/otaruit/items/44b487e45e5bb6247376

## 1.API GatewayでREST APIの作成
AWSでAPI Gatewayをひらき、「APIを作成」をクリック
![Screenshot 2024-09-05 124626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/314ee254-ccc0-28fe-87ea-342ccc8da614.png)

## 2.REST A

元記事を表示

【AWS,Python】Lambdaを使ってJSONファイルをS3に保存する

# LambdaからS3に保存

![Screenshot 2024-09-05 114344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/c852df12-86b9-0367-b3ea-6a5c5730e440.png)

以前作ったlambdaの関数↑から、取得したJSONファイルをS3へ保存させるようにしました。

https://qiita.com/otaruit/items/44b487e45e5bb6247376

## S3への保存にはboto3が必要

以前作成したコードに
boto3
のインポートを追加します。

“`python
import json
import boto3 //ここを追加
from datetime import datetime
import requests
from bs4 import BeautifulSoup
import urllib3
“`
## boto3からS3オブジェクトを呼び出す
boto3.resource(‘s3

元記事を表示

Lambdaの”Task timed out after x.xx seconds”ログが出力されない問題

# 🔹結論
現状pythonのランタイムバージョンが3.12だと出力されない(3.11までは出力される)
python以外については未検証
他のランタイムバージョンにも波及する可能性あり
# 🔹詳細
以下の記事をもとにLambdaのタイムアウトエラーに対して通知できるような機能を実装しようとしたのですが、
「Task timed out after x.xx seconds」が出力されませんでした。
> [Lambda 関数がタイムアウトしているかどうかを確認するにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/lambda-verify-invocation-timeouts)

ネット上に情報が特になく、以下検証を実施しました。

## 🔸前提
・アーキテクチャ:x86_64
・タイムアウト:3秒
・コードの中身:
“` python
import json

def lambda_handler(event, context):
# TODO implement
while True:

元記事を表示

StepFunctionsのHTTP Endpoint Call third-party APIを諦めた話

## はじめに
Step Functions + LambdaでAPIからデータ収集していたものを、HTTP Endpoint Call third-party APIを使ってStep Functionsのみで実装しようとしたけど諦めた話。

## 結論
HTTP Endpoint Call third-party APIを利用する際には、タイムアウトが最大5秒までしか対応しておらず、今回利用するAPIはレスポンスに5秒以上かかることがよくあるためLambdaでAPIを実行することにした。

## どういうことか
HTTP Endpoint Call third-party APIを使う際には、EventBridge Connectionを介してAPI接続することとなる。

EventBridge Connectionのコンソールにわかりやすい下記の図がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177290/5cce066e-f8f6-d977-3d08-026f55c7df

元記事を表示

AWSのLambdaとAPI Gatewayでプロキシ統合てhtmlを表示しようとしたら文字化けした

AWSでLambdaとAPI GatewayのRest APIを用いてサーバーレスでWebサイトを作ろうとしたところ、日本語のhtmlを表示しようとしたときに文字化けしてしまった。
このとき、API Gatewayの設定でLambdaのプロキシ統合は有効にしていて、Lambdaのソースコードはざっくりとは下記の通り。
“`python
def lambda_handler(event, context):
html = “””\

日本語を含むhtml

あいうえおかきくけこ

“””
return {
“statusCode”: 200,
“headers”: {
“Content-Type”: “text/html”
},
“body”: html
}
“`
調べてみると、プロキシ統合を有効にしない場合ではAPI Gatewayの設定で「Content-Typeをapplication/json;charset=UTF-8にする」ことにより日

元記事を表示

AWS SAM + Go + DynamoDB local + GitHub Actions で環境構築する

# はじめに
先日、業務で`AWS SAM` `Go` `DynamoDB local` `GitHub Actions` を使って環境構築する機会がありました。
しかし、この組み合わせについて紹介した日本語の記事があまりない印象でしたので本記事で紹介したいと思います。
ぜひ本記事を参考にして、マイクロサービス開発の第一歩を踏み出してみてください!

# SAMプロジェクト作成
1. **プロジェクトを作成するディレクトリに移動**
– プロジェクトを作成するディレクトリに移動します。
“` bash
$ cd develop # develop部分は自身のプロジェクトディレクトリを入力
“`

2. **`sam init` コマンドを実行**
– コマンドを実行しSAMプロジェクトを作成します。
– コマンドを実行すると対話形式のプロンプトが出力されます。以下、実際のプロンプトにコメントアウトで補足しております。
“` bash
$ sam init

You can prese

元記事を表示

AWS LambdaとSnapStart

# はじめに
AWS Lambdaは、開発の面ではプログラミングが簡単で、運用の面では変化する使用パターンに迅速に対応できるアプリケーションです。Lambdaの特徴は、**関数が安全で、隔離された環境**で実行される点です。各環境のライフサイクルは、**Init**、**Invoke**、**Shutdown**という3つの段階で構成されます。

## AWS Lambdaのライフサイクルごとの特徴

| Category | Desciption |
|————|——————————————————————————|
| Init | 関数のランタイムをブートストラップし、静的コードを実行 (INIT_REPORT) |
| Invoke | APIリクエストに応答してLamb

元記事を表示

Lambdaってどんな時に使うの?利用シーンをいくつか紹介 ~100本ノックしてみたい中堅エンジニア 【AWS】~ 4/100

# はじめに

本記事ではLambdaをどんな利用シーンで使うか、ケース毎にいくつか紹介します。
※具体的に作ったり、詳細な機能の説明はしませんがご了承ください

Lambdaの機能については、[こちら](https://qiita.com/namasa/items/3a0d703565643f364133)で紹介しています。

# サーバーレスAPIを作りたい

これが一番Lambdaのユースケースとして多いと思っています。
APIのバックエンドとして、EC2やECSも候補にあがると思いますがこれらは常時稼働することになります。

なので、リクエスト数がそこまで多くない場合などは無駄にコストがかかってしまいます。
そこで、利用した時間だけ課金されるLambdaを利用することによって、コスト効率が高まります。
Well-Architected Frameworkの`コスト最適化`ですかね:thinking:

DBの候補として3つ書いてありますが、RDBである必要性やリクエスト数などによって、いずれかを選択することになると思います

![学ぶべきこと-サーバーレスAPI.drawio

元記事を表示

ForwardRef._evaluate() missing 1 required keyword-only argument: ‘recursive_guard’

# 目的
Lambd関数内で以下のlangchain関連のパッケージを使っていたのですが、ある日を境に表題のエラーが発生するようになりました。
“`python
from langchain_aws import ChatBedrock
from langchain_core.messages import HumanMessage
from langchain.prompts import PromptTemplate
“`

エラー内容の全貌

“`terminal
[ERROR] TypeError: ForwardRef._evaluate() missing 1 required keyword-only argument: ‘recursive_guard’
Traceback (most recent call last):
File “/var/lang/lib/python3.12/importlib/__init__.py”, line 90, in import_module
return

元記事を表示

【AWS】AWS SAMが想像以上にバケモノかもしれないことに気づいてしまったかもしれない

どうもこんにちは。

今回は、AWSのセミナー内でお話に出てきた、AWS SAMについて調べたのでまとめてみました。

ちなみに私、感動しております。

# AWS SAMってなに?

**AWS SAM (Serverless Application Model)** は、サーバーレスアプリケーションをローカルで開発、テスト、デプロイするための強力なオープンソースフレームワークです。AWS SAMを使用するには、AWS SAM CLIというものをインストールする必要があります。

ちなみに、AWS SAM自体は無料で使用できます。AWS SAMを使用して作成したAPI GatewayやLambda関数に対してのみ料金が発生します。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html

# 通常、サーバーレスアプリケーションを作成するにはどうする?

通常では、以下のような構成でサーバーレスアプリケーションを構築すると思います。(最も

元記事を表示

PythonのLambda Layerを作成する方法

# フォルダ直下構成
以下の構成が必要なようです
pythonディレクトリ内に必要なライブラリをインストールする必要があります
![lambda_layer.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1952885/460ae25f-ac39-183b-f78a-1cd5b212ba24.png)

# 実際の作り方
1.任意のディレクトリ内にpythonディレクトリを作成する
2.pythonディレクトリに必要なライブラリをインストールする
“`
pip install boto3 -t python
“`
3.pythonディレクトリをzip化
“`
zip -r layer.zip ./python
“`
4.手順3でzip化したものをlayerとして登録する
[AWS Lambda Layersでライブラリを共通化](https://qiita.com/t_okkan/items/394a15577bd1aad46ec3#layer%E3%81%AE%E8%BF%BD

元記事を表示

【これ検索するの何回目だよ】API Gateway + Lambdaプロキシ統合でもう躓きたくない

# はじめに
フロントエンドからAPI Gatewayを経由してLambdaを実行する時、毎回少しだけ躓きます、、、。
解決はするのですが、何度も同じことを経験しては忘れてを繰り返しているので教訓をまとめます!!!

# 教訓
1. **統合レスポンスをクライアントに返却する際、lambda → API Gatewayのレスポンスは正しい形式である必要がある!**
1. **ライブラリによってPOSTの仕方が異なるので注意するべし!!**
1. **フロントのリクエストボディはparseして利用!!!**

これだけです!あとは簡単!!
lambda統合機能最高!!!

# 動作確認

## 1. **統合レスポンスをクライアントに返却する際、lambda → API Gatewayのレスポンスは正しい形式である必要がある!!**

API Gatewayのメソッドテスト機能で、以下のようなエラーが発生することがあります。

![cap05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/

元記事を表示

Serverless frameworkで`prisma migrate`を実行する

## この記事を書こうと思った理由
serverless frameworkとPrismaで開発をすることになったのですが、
スキーマを反映させるためのコマンド`prisma migrate`を
lambdaで実行するのにとても苦労したので、自分のした処理をここにまとめます。
本当はもっと良い方法があると思うので、知ってましたら教えてください。

# 実行手順

## 1.Prismaインストール

PrismaとPrisma CLIをインストールします。

“`bash
yarn add prisma @prisma/client
“`

Prisma CLIをインストールしたら、Prismaの設定を初期化します。

“`bash
yarn prisma init
“`

このコマンドにより、prismaディレクトリが作成され、schema.prismaファイルが配置されます。

## 2. データベース接続の設定

.envファイルを開き、使用するデータベースに合わせて接続URLを設定します。
例えば、MySQLを使用する場合は以下のようになります。

“`

元記事を表示

【AWS】EventBridge -> Lambda -> RDSのストプロ -> Slack通知の流れを構築する

# 概要
EventBridge -> Lambda -> RDSのストプロ -> Slack通知の流れを構築しました。

具体的にいうと、
「毎日9時に、プロシージャで実施した結果を、指定のSlackチャンネルに通知する」
という流れがゴールです。

構築手順と注意点を解説します。

# 手順概要
1. ストアドプロシージャを作成する
2. Lambda用のSecurityGroupを作成する
3. Lambda用のIAM Roleを作成する
4. Lambda関数を作成する
5. LambdaをVPCに設定する
6. RDSのSecurity Groupを編集する
7. EventBridgeSchedulerを設定する

# 手順詳細
## 1. ストアドプロシージャを作成する

まず、今回使うSQLを該当のRDSにプロシージャとして保存します。
今回は、sample_tableのcreate_dateカラムが前日のもので、かつ、sample_noカラムに指定の文字列から始まるレコードが何件あるか、というSQLになります。

“`count_number.sql
CREATE

元記事を表示

OTHERカテゴリの最新記事