- 0.0.1. AWS Lamba関数をテストする際にbodyの書きかた
- 0.0.2. lambdaでエラーログファイルをs3へ書き込む
- 0.0.3. REST APIでDynamoDBからデータを取得してみる
- 0.0.4. サーバーが落ちた時にターゲットグループを切り替える
- 0.0.5. AWS Lambda(Python Runtime)でMicrosoft SQL Serverとの接続に必要なカスタムレイヤーについて
- 0.0.6. GASとChalice (lambda) を連携させて、Payloadの値を取得してみた
- 0.0.7. S3バケットのファイル内容をLambdaで書き換えて別バケットにアップロードする
- 0.0.8. 【Lambda】ReportLabで任意のフォントを使用してS3に格納する
- 0.0.9. Lambdaからタイムアウト時間を取得する
- 0.0.10. AWS Lambdaへのデプロイにマルチステージビルドのコンテナイメージを使う【Ruby】
- 0.0.11. Terraform ✖️ Lambda credential管理
- 0.0.12. CDKを使ってLambdaFunctionとLayerを一気にデプロイする
- 0.0.13. LambdaとAPI Gatewayを用いて, S3にpdfファイルをアップロード& BedRock ナレッジベースを同期
- 0.0.14. 【AWS,Python】LambdaとAPI Gateway でJSONを返すAPIを作る
- 0.0.15. 【AWS,Python】Lambdaを使ってJSONファイルをS3に保存する
- 0.0.16. Lambdaの”Task timed out after x.xx seconds”ログが出力されない問題
- 0.0.17. StepFunctionsのHTTP Endpoint Call third-party APIを諦めた話
- 0.0.18. AWSのLambdaとAPI Gatewayでプロキシ統合てhtmlを表示しようとしたら文字化けした
- 1. 日本語を含むhtml
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 iofrom 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 canvasim
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 jsondef 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 initYou can prese
AWS LambdaとSnapStart
# はじめに
AWS Lambdaは、開発の面ではプログラミングが簡単で、運用の面では変化する使用パターンに迅速に対応できるアプリケーションです。Lambdaの特徴は、**関数が安全で、隔離された環境**で実行される点です。各環境のライフサイクルは、**Init**、**Invoke**、**Shutdown**という3つの段階で構成されます。## AWS Lambdaのライフサイクルごとの特徴
| Category | Desciption |
|————|——————————————————————————|
| Init | 関数のランタイムをブートストラップし、静的コードを実行 (INIT_REPORT) |
| Invoke | APIリクエストに応答してLamb