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

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

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)を使ってアクセスする。
PATはKonnectに

元記事を表示

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

元記事を表示

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:

元記事を表示

OTHERカテゴリの最新記事