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

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

マイGPTを使って反社調査を行う

## マイGPTとは
英語版では`My GPTs`と表示されますが、本記事では`マイGPT`と表記します。

マイGPTは、OpenAIのChatGPTを使って、誰でも簡単にカスタムチャットボットを作成できるサービスです。プログラミングの知識がなくても作成可能です。

**My GPTs**を利用するには、有料の**ChatGPT Plus**か、それ以上のプランに加入する必要があります:point_up_tone1:
![myGPTpng.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/c4eb7f9b-59b4-d5a9-6560-845a6193c0f9.jpeg)

## 早速作ってみよう
お馴染みな[ChatGPT画面](https://chatgpt.com/)の右上からメニューを開いてください、`マイGPT`をクリックしてください。
![2E91FE27-D8F8-4E7A-AA7F-03FE6165331B.jpeg](https://qiita-image-store.s

元記事を表示

RevenueCat WebhookをAWS API Gateway、Rust Lambda、DynamoDBで処理する

RevenueCatは、iOS、Android、Webなど様々なプラットフォームでアプリ内サブスクリプションを簡素化する強力なサブスクリプション管理サービスです。その主要機能の1つは、購入、更新、キャンセルなどのサブスクリプションイベントについてバックエンドに通知するWebhookを送信する能力です。この記事では、AWS API Gateway、AWS Lambda(Rustで実装)、およびストレージ層としてDynamoDBを使用して、RevenueCat Webhookを処理する方法を探ります。

![RevenueCat-Webhooks with AWS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887819/8af63fd5-705c-983d-48e9-b334c03a9315.jpeg)

## アーキテクチャ概要

アーキテクチャは以下の主要コンポーネントで構成されています:

1. **RevenueCat Webhook**:RevenueCatはWebhookイベント(サブスク

元記事を表示

FastAPIのAPIサーバをAWSのAPI Gateway+Lambdaを使って動作させる方法

# デプロイ手順
※FastAPIのアプリケーションがある
1. LambdaでFastAPIのAPIサーバを実行できるようにする設定をする([Mangum](https://github.com/Kludex/mangum))
1. [Serverless Framework](https://www.serverless.com/)でAWSにデプロイできるようにする
– LambdaにPythonライブラリがインストールされるようにする設定をする
1. [Serverless Framework](https://www.serverless.com/) でAWSにデプロイする

## FastAPIのアプリケーションがある
app.py

“`python
from fastapi import FastAPI

app = FastAPI()

@app.get(“/”)
def hello_world():
return {‘message’: ‘Hello from FastAPI’}
“`

## LambdaでFastAPIのAPIサーバを実行でき

元記事を表示

AWS Lambda – Provisioned Concurrency設定時の振る舞い

AWS LambdaにProvisioned Concurrencyを設定した際、不可解な現象に遭遇したため、原因を調査した。

### 発生した現象

Provisioned Concurrencyを設定したLambda関数について、同時実行がないにも関わらず下記のような `Init Duration` を含むログが出力され、コールドスタートが発生してしているように見える。さらに `Init Duration` の数値がOn-Demand Concurrencyの場合に比べて大幅に増加している。

“`
REPORT RequestId: xxxx Duration: xx ms Billed Duration: xx ms Memory Size: xx MB Max Memory Used: xx MB Init Duration: xx ms
“`

### 解析結果

* 結論としては、ログに `Init Duration` が出力されているが、実際にはコールドスタートは発生していない。
* Provisioned Concurrencyを設定した場合も定期的にインスタン

元記事を表示

Lambda関数でMySQLに接続する

AWSが提供しているライブラリには直接MySQLデータベースと接続する機能は含まれていないため、LambdaでRDSのMySQLに接続する場合、PyMySQLなどの外部ライブラリを使う必要がある。

## レイヤー追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/f41bd875-cf0d-41bb-6c7f-74fa61612888.png)

レイヤーソース:ARNを指定
パブリック公開されているレイヤーのARNを指定する

https://github.com/keithrozario/Klayers/tree/master/deployments

ランタイムとレイヤーのPythonバージョンは合わせる
※バージョンが異なると、ライブラリのバイナリや依存関係が異なるため、互換性の問題が生じる可能性がある

## lambdaコード
“`python
import pymysql
import os

def lambda_handler(event, con

元記事を表示

【API Gateway】バイナリペイロードを適切に扱う

# はじめに
API Gatewayで扱うリクエスト、レスポンスに含まれるペイロードはテキストペイロードとバイナリペイロードに区分される。
| ペイロード | 説明 |
|:-:|:-:|
|テキスト|UTF-8エンコードされた JSON 文字列|
|バイナリ|テキストペイロード以外のペイロード|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/7482c394-14ef-0951-549b-b77d379f76b4.png)
バイナリペイロードを扱うためには、Lambdaプロキシ統合の利用有無によって適切にAPI Gatewayを構成する必要がある。

# Lambdaプロキシを利用する場合
必要な設定は以下の通りです。
– レスポンスのbase64エンコード
Lambdaプロキシの利用時にバイナリペイロードを処理するためには、Lambdaからのレスポンスをbase64でエンコードする必要がある。
– binaryMediaTypes
binaryMedi

元記事を表示

Konnectの証明書の期限をLambdaで監視し、CloudWatch経由でメール通知する

API Gatewayの1つであるKong GatewayにはSaaS版があり、Konnectという名前で展開されている。
このKonnectでは証明書を登録し、管理する機能がある。
![20240916103714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/e44681f1-958c-2b26-9c5e-98fe6911cf27.png)

Konnectはこの証明書の有効期限を監視・通知する機能を’24/9時点では提供していない。
しかし、APIによる期限の取得は可能となっているため、ユーザ自身が作り込むことで監視・通知することが出来るようになっている。
今回はこれを使って証明書の有効期限をLambdaで取得し、CloudWatchにメトリクスとして登録してアラート通知を受け取るようにしてみる。

## Konnect APIの基礎
KonnectはAPIによる操作も可能で、操作にはPersonal Access Token(PAT)を使ってアクセスする。公式の説明ページは[こちら

元記事を表示

[Amazon Web Services]LambdaでEC2の定期停止設定してみた

最近、個人AWSアカウントを活発に利用しており、EC2インスタンス台数が増加してきました。その中で、EC2利用後、ついついインスタンス停止を忘れてしまっており、余計なコストが発生しております。そこでLambdaを利用し、EC2の定期停止設定をしてみました。

## LambdaによるEC2定期停止設定の前提
\- 対象リージョンはバージニア北部であること(後続のコードを修正することで変更可能)
\- 定期停止対象のEC2に対して、タグ[key:EC2Auto_Stop, value:true]が付与済みであること

## Lambda実行用IAMポリシー作成
まずはLambda実行用IAMポリシーを作成していきます。

1.IAMコンソール>左ペイン「IAMポリシー」>右上「ポリシーの作成」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/42b71a15-5695-5df1-aacb-5d218c1d4421.png)

2.[アクセス許可を指定]にて、JSONで下

元記事を表示

サーバーレスを小学生でも分かる様に解説する試み

## 従来の方式が抱えていた課題
昔のシステム開発では、オンプレミスのサーバーにOSをインストールし、その上にアプリケーションやミドルウェア(Webサーバー、DBMSなど)を設定するのが一般的でした。その後、仮想化技術の普及により、EC2などのクラウド上の仮想サーバーを利用するケースが増えました。しかし、これらの方式には以下のような課題があります。

– (オンプレミスの場合) サーバーのハードウェア調達とOSのインストールに手間と時間がかかる
– OSやミドルウェアのインストール・設定に専門知識が必要
– OSやミドルウェアのバージョンアップ、セキュリティパッチ適用などの保守作業が必要
– 利用者がいない時間帯でもサーバーを起動し続ける必要があり、コストがかかり続ける
– スケーリングのために設定変更が必要で、トラフィックの増減に柔軟に対応しづらい
– ストレージについても、容量の見積もりや増設の作業が必要

## サーバーレスの登場
こうした課題を解決するため、近年ではサーバーレスアーキテクチャが注目を集めています。主要なクラウドプロバイダーは以下のようなサーバーレス関数サービスを

元記事を表示

コンテナイメージを使用した Lambda 関数を作成してみた

# 背景・目的
AWS Lambdaでは、コンテナイメージをサポートしています。こちらについて基本的な知識の整理と簡単な動作確認を行います。

# まとめ
下記に特徴をまとめます。

| 特徴 | 説明 |
|:–|:–|
|Lambdaのコード|下記で構成される

・スクリプト
・コンパイルされたプログラム
・上記の依存関係|
|デプロイ方法|デプロイパッケージを使用し、Lambdaに関数コードをデプロイする|
|Lambdaがサポートするデプロイパッケージ|・コンテナイメージ
・zipファイル|
|Lambda関数のコンテナイメージを構築する方法|・Lambda の AWS ベースイメージを使用する
・AWS の OS 専用ベースイメージを使用する
・非 AWS ベースイメージを使用する|
|Lambda の AWS ベースイメージを使用する|Lambda に AWS ベースイメージの 1 つを使用して、関数コードのコンテナイメージを構築する

ベースイメージには、Lambdaでコンテナイメージを実行するために必要な言語ラン

元記事を表示

AWS Lamba関数をテストする際にbodyの書きかた

AWS LambdaとAPI Gatewayを使ってAPIを実装するユースケースは多いと思います。

自分がLambda関数のテスト機能を使う際に、リクエストの「`body`」の書き方で詰まってしまったので、その時の解決法を共有します。

# 問題点

テスト機能を使ってLambda関数を実行しようとした際、以下のような形式でリクエストを送信したところ、エラーが発生しました。

“`json
{
“body”:
{
“userId”:”test20240822@test.com”,
“displayName”:”test20240822″,
“email”:”test20240822@test.com”
}
}

“`

この形式で送ると、Lambda関数内で`body`の内容がパースされず、以下のようなエラーメッセージが表示されることがあります:

“`
{
“errorMessage”: “Could not parse request body into json: Unexpected

元記事を表示

lambdaでエラーログファイルをs3へ書き込む

# やりたいこと
lambdaでエラーログファイルをs3へ書き込む
・S3バケット作成
・IAMポリシーとIAMロール作成
・Lambda関数作成

# ①S3作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/218e4591-f646-440a-731b-822dee4d94cf.png)

全部デフォルト設定でよい
(ACL 無効 (推奨))
(パブリックアクセスをすべて ブロック にチェック)
(バケットのバージョニングを無効)

# ②IAMポリシーとIAMロール作成
先にポリシーを作成

“`
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“s3:PutObject”
],
“Resource”:

元記事を表示

REST APIでDynamoDBからデータを取得してみる

# 概要

本記事は [AWSでWebアプリを構築してみる](https://qiita.com/ti_and6id/items/9670ee60965a4d10bec7) シリーズの7回目の記事です。
前回の記事は [こちら](https://qiita.com/ti_and6id/items/3cc12183659493d735d7)。

# 本記事で作成する構成

[REST APIを作成してみる](https://qiita.com/ti_and6id/items/b5fd3eec7bf0a68ecc8c) では Lambda に直接レスポンスするデータ(JSON)を記載していましたが、今回はデータをDynamoDBから取得したものをレスポンスするようにしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/74ae02a7-b9f2-5bd9-f921-892b23dc2991.png)

# REST APIでDynamoDBからデータを取得してみる

元記事を表示

サーバーが落ちた時にターゲットグループを切り替える

こんにちは。ねこしまです。
今回は、ELBにリスナーとして登録されているEC2①が落ちてしまった際にEC2②のターゲットグループにリスナーを切り替えるという作業を行う機会があったのでその内容を共有したいと思います。

## はじめに
### 全体の流れ
ELBにリスナーとして登録されているターゲットグループのEC2がUnHealthyになった際にCloudWatchアラームで検知し、SNSに流します。
SNSではメール送信と共にLambdaのトリガーとします。
LambdaではEC2①のターゲットグループをリスナーから外し、EC2②のターゲットグループを新たにリスナーとして登録をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883742/c6f54dfb-8160-b8a2-1dc4-af58fa8ed6b8.png)

### 前提条件
 ・VPCやサブネット・ELB・EC2が作成済みであること
### 対象外事項
 ・ターゲットグルー

元記事を表示

AWS Lambda(Python Runtime)でMicrosoft SQL Serverとの接続に必要なカスタムレイヤーについて

### はじめに

AWS Lambda(Python Runtime)を使用して、Amazon RDS Microsoft SQLに接続するには、ODBCドライバーとpyodbcモジュールを含むカスタムレイヤーを用意する必要があります。Lambda環境でODBCドライバーを使用するのは少し複雑ですが、適切に設定すれば非常に強力な機能を提供します。

**なぜカスタムレイヤーが必要なのか?**

AWS LambdaのRuntimeには基本的なライブラリやモジュールしか含まれていないため、特定のライブラリやモジュールを使用する場合はカスタムレイヤーが必要です。例えば、Pyodbcモジュールや特定のバージョンのPythonライブラリはLambdaの標準環境には含まれておらず、これらを利用するためにカスタムレイヤーが必要となります。

**カスタムレイヤーのメリット**:

– **再利用性**: 一度作成したレイヤーは、複数のLambda関数で再利用できます。
– **依存関係の管理**: ドライバーやライブラリの依存関係を簡単に管理でき、バージョンアップや修正も容易です。
– **デプ

元記事を表示

GASとChalice (lambda) を連携させて、Payloadの値を取得してみた

## 概要
Google Apps Script (GAS) から AWS Lambda の Chalice フレームワークを通じて POST リクエストを送信し、値を取得する方法について調べました。特に、Chalice 側で送信された JSON ペイロードの処理方法に焦点を当てています。

## 結論
Chalice で受信した JSON ペイロードからデータを取得するためには、実装がこちらです。
“`python
app.current_request.json_body.get(key)
“`

## 前提
* AWSアカウントを所持していること

## 手順

### Chalice のインストールと環境構築

Chalice をインストールします。
“`zsh
pip install chalice
“`

プロジェクトを作成します。

“`bash
chalice new-project chalice-sample
“`

### Chalice アプリの修正

次に、Chalice 側のアプリケーション (`app.

元記事を表示

S3バケットのファイル内容をLambdaで書き換えて別バケットにアップロードする

# はじめに
本記事では、S3バケットにファイルがアップロードされたときにLambdaを使用でそのファイル内容を修正し、別のバケットにファイルをアップロードする方法について実装します。

# ゴール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/122f805b-bb16-6891-0601-db0e6954fe3a.png)

S3バケットにファイルをアップロードした際に、LambdaでS3バケットからファイルを取得し、内容を修正したファイルを別のS3バケットにアップロードする

# 前提
下記2つのS3バケットは事前に作成しておきます。
– ファイルダウンロード元のバケット(本記事では変数 `source_bucket`)
– 修正されたファイルのアップロード先となるバケット(本記事では変数 `upload_bucket`)

また、LambdaにはS3へのIAM設定をしておきます。

# 環境
Python 3.12

# 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++などのネイテ

元記事を表示

OTHERカテゴリの最新記事