- 0.0.1. AWS Lambda(Python Runtime)でMicrosoft SQL Serverとの接続に必要なカスタムレイヤーについて
- 0.0.2. GASとChalice (lambda) を連携させて、Payloadの値を取得してみた
- 0.0.3. S3バケットのファイル内容をLambdaで書き換えて別バケットにアップロードする
- 0.0.4. 【Lambda】ReportLabで任意のフォントを使用してS3に格納する
- 0.0.5. Lambdaからタイムアウト時間を取得する
- 0.0.6. AWS Lambdaへのデプロイにマルチステージビルドのコンテナイメージを使う【Ruby】
- 0.0.7. Terraform ✖️ Lambda credential管理
- 0.0.8. CDKを使ってLambdaFunctionとLayerを一気にデプロイする
- 0.0.9. LambdaとAPI Gatewayを用いて, S3にpdfファイルをアップロード& BedRock ナレッジベースを同期
- 0.0.10. 【AWS,Python】LambdaとAPI Gateway でJSONを返すAPIを作る
- 0.0.11. 【AWS,Python】Lambdaを使ってJSONファイルをS3に保存する
- 0.0.12. Lambdaの”Task timed out after x.xx seconds”ログが出力されない問題
- 0.0.13. StepFunctionsのHTTP Endpoint Call third-party APIを諦めた話
- 0.0.14. AWSのLambdaとAPI Gatewayでプロキシ統合てhtmlを表示しようとしたら文字化けした
- 1. 日本語を含むhtml
- 1.0.1. AWS SAM + Go + DynamoDB local + GitHub Actions で環境構築する
- 1.0.2. AWS LambdaとSnapStart
- 1.0.3. Lambdaってどんな時に使うの?利用シーンをいくつか紹介 ~100本ノックしてみたい中堅エンジニア 【AWS】~ 4/100
- 1.0.4. ForwardRef._evaluate() missing 1 required keyword-only argument: ‘recursive_guard’
- 1.0.5. 【AWS】AWS SAMが想像以上にバケモノかもしれないことに気づいてしまったかもしれない
- 1.0.6. PythonのLambda Layerを作成する方法
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
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