- 1. Mangumを使ってLambda + FastAPI + Dockerで最小限&サーバーレスなAPIをデプロイする
- 2. GitHubActionsを使いAWSのlambdaにデプロイする
- 3. AWS Lambdaの入門としてやってみた事をまとめた話(Python)
- 4. AWS Lambda + Eventbridge でインスタンス名からインスタンスIDを取得してタグを作成・削除する
- 5. AWS Lambdaを用いてSlackへの誕生日botを作成する方法
- 6. AWS CDK – Dynamic require of “xxx” is not supported エラー対応
- 7. API GatewayにLamba Authorizerを組み込む
- 8. AmazonConnectを使ってスマホに電話をかける自動化Lambda
- 9. AWSのサポート切れをきっかけに、画像の透かし入れ機能をレガシーシステムからサーバーレスに切り替えた話
- 10. セキュアな SkyWay Auth Token を生成してチュートリアルやってみた
- 11. 定期的にCloudWatchLogsを集計してSlackに流すLambdaを作る
- 12. AWS lambda (arm) Python3.10.xにライブラリをLayerで追加する方法
- 13. serverless-aws-alias プラグインで “Error: Cannot find module” が発生する原因と対処
- 14. API GatewayからPubSubバックエンドLambaに接続する。
- 15. 最近ストリーム対応したLambdaでChatGPTを動かす
- 16. APIゲートウェイの代わりに関数URLを使ってみた
- 17. AWS Lambda 用ミドルウェアフレームワークの作成方法を middy を題材に検証(2)
- 18. AWS Lambda 用ミドルウェアフレームワークの作成方法を middy を題材に検証(1)
- 19. Slackに入力したテキストを使ってLambdaで画像を生成して返す
- 20. Amazon SNSとAmazon SQSでPubSubの仕組みを実装する
Mangumを使ってLambda + FastAPI + Dockerで最小限&サーバーレスなAPIをデプロイする
## AWSで サーバーレス API のデプロイってちょっと大変
AWSでサーバーレスなBackend APIを作りたい時、まずAPI Gatewayを選択肢に挙げるBackendエンジニャーな方は多いかと思います。
ご存知の通り、API Gatewayは単体ではコードロジックを実行できません。
なので、API Gateway -> LambdaのようにProxyさせるやり方は、ど定番で誰もがやったことあるパターンです。とはいっても、API Gatewayは独自な仕様が多く、AWSコンソールからいじるのも色々とキツく、かといってterraformで書くのも冗長な感じで、なかなか使いこなせないと思っているAWSユーザも多いかと思います。
(少なくとも私はそうです)API Gatewayに頼らずもっと簡単にサーバーレスしたい。
そこで、MangumとLambdaのFunctionURLを使い、Lambda単体でBackend APIをデプロイしてみましょう。
デプロイし、ブラウザでAPIを叩けたらゴールです。## Mangum
https://mangum.io/>Ma
GitHubActionsを使いAWSのlambdaにデプロイする
## 事前準備
### 1. アプリケーション
1. GitHubにリポジトリを作成します、「lambda_github_action_test」とします
1. ※1のようなディレクトリとファイルを作成 (deploy.ymlはこの時点では空ファイルとしておく)
1. lambda_function.pyは※2のような内容で作成※1
“`
lambda_github_action_test
├─ .github
│ └─ workflows
│ └─ deploy.yml
└─ src
└─ lambda_function.py
“`※2
lambdaの関数にアクセスすると、json形式でHello from Lambda!が返却される関数を作成する
“`python
import jsondef lambda_handler(event, context):
return {
‘statusCode’: 200,
‘body’: json.dumps(‘Hello from Lambda! Git
AWS Lambdaの入門としてやってみた事をまとめた話(Python)
※2022年に下書きに書いたまま残っていた記事を2023年に投稿
`AWS Lambda`はAWSが提供するサーバーレスでコードを実行するサービスですが。
今回、`AWS Lambda`を普段さわっていない人間がその入門として、下記のような流れで学習してみました。
– AWSの各種ドキュメントを参照
– AWSのチュートリアルを実施(Python)3つ実施したチュートリアルのうち最後に実施したひとつ。[チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-tutorial.html)
でドキュメントに書いてある内容の理解に時間を要し、チュートリアルを完了するのにだいぶ苦労しましたが。それ以外は概ねスムーズに学習できたかと思います。
2022年現在、`AWS Lambda`を知らない所からの理解の助けにはなったと思うの、どのように学習を進めたのか本記事に記載しておきます。
あと自分は、[チュートリアル: Amazon S3
AWS Lambda + Eventbridge でインスタンス名からインスタンスIDを取得してタグを作成・削除する
lambdaの練習がてら作成した関数のメモです。
今回作成したのはインスタンス名からインスタンスIDを取得して、対象インスタンスのタグを作成・削除する関数になります。
インスタンスIDは変わる可能性があるらしいので、インスタンス名からインスタンスIDを取得する流れにしました。## lambda用IAMロール
“ec2:Start*” と “ec2:Stop*” は今回関係ないのでいらないです。
“`
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“logs:CreateLogGroup”,
“logs:CreateLogStream”,
“logs:PutLogEvents”
],
“Resource”: “arn:aws:logs:*:*:*”
AWS Lambdaを用いてSlackへの誕生日botを作成する方法
# はじめに
※初のQiita記事ですので、分かりにくい部分等ご容赦くださいコミュニケーションツール、どんなものを使っていらっしゃいますか?
弊社の自社開発チームでは、コミュニケーションツールとして Slack を使用しています。自作の絵文字を使えるなど、便利な機能がたくさんある Slack ですが、
中でも便利なのは、他のツールとの連携がしやすい点ではないでしょうか。今回はそんな Slack を使い、誕生日の人をお祝いしてくれる誕生日botを
AWS Lambdaを用いて作成した手順をお伝えします。
最終的に、このような派手な見た目で誕生日をお祝いしてくれるbotが作れます。![誕生日Bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726324/fbdb88a7-f1dd-b03c-e3b2-72383770a08d.png)
この記事が何かのお役にたてますと幸いです。
# 前提
AWSは既に立ち上がっていると想定しています。
使用するものは以下3つです。
– Inc
AWS CDK – Dynamic require of “xxx” is not supported エラー対応
# 内容
AWS CDKのLambda実装で`@aws-lambda-powertools/logger`を使用した際、
以下エラーが発生したため対応方法メモ“`json
{
“errorType”: “Error”,
“errorMessage”: “Dynamic require of \”node:crypto\” is not supported”,
“stack”: [
“Error: Dynamic require of \”node:crypto\” is not supported”,
” at file:///var/task/index.mjs:1:383″,
” at file:///var/task/index.mjs:13:15027″,
” at file:///var/task/index.mjs:1:499″,
” at file:///var/task/index.mjs:13:23037″,
”
API GatewayにLamba Authorizerを組み込む
## はじめに
API GatewayにLambda Authorizerを組み込んで、以下のことを実施しました。
* Headerにセットされている値をチェックする認証処理の実装。
* 後続のバックエンド(Lambda)に渡すデータをセット。一応前回までで構築しているPubSubの仕組みにAuthorizerを追加した構成になりますが、Authorizerについては前提構成なしで本記事だけで内容を追っていけると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/0f329dcd-32a5-4c4c-4cf7-b4401292c23a.png)
前回までの構成は以下記事で投稿しています↓https://qiita.com/kennyQiita/items/9311e065529785ed7f50
以下順序で整理していこうと思います。
1. Authorizer用のLambdaの作成。
1. コンソールからAPI GatewayにAuthorizerを設定する
AmazonConnectを使ってスマホに電話をかける自動化Lambda
### はじめに
AmazonConnectを利用してLambdaから架電する場合のサンプルコードを載せています。
初心者向け
※ AmazonConnectのフローやキュー作成などの詳細は省いてます—
### AWS構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/325067f8-b8d0-a97e-3c6e-1dac5ab8ae2b.png)—
### 流れ
1. 事前準備
2. Amazon Connect概略
3. Lambdaコード—
### 1. 事前準備
・1. AmazonConnectで利用する架電元の電話番号をtwillioなどの無料で電話番号を取得できるサービスなどで取得しておきます。
https://www.twilio.com/ja/docs/usage/tutorials/how-to-use-your-free-trial-account
![image.png](https://qiita-image-s
AWSのサポート切れをきっかけに、画像の透かし入れ機能をレガシーシステムからサーバーレスに切り替えた話
# 背景
[こちらの発表](https://aws.amazon.com/jp/blogs/news/tls-1-2-required-for-aws-endpoints/)のとおりAWSでは今後TLSのバージョンが1.2未満の通信を許可しなくなるため、影響を受けるシステムは修正しないと使えなくなります。
長年メンテナンスせずに放置されてきたシステムは簡単には更新できず、画像の透かし入れぐらいの機能なら、サーバーレスで完全に作り直した方が良いのでは?ということで実装してみることになりました。
# 切り替えることによって得られたメリット
## 保守性の向上
大昔から存在する古臭いJavaのアプリケーションをサーバーレスに切り替えたことにより、コードベースが大幅に削減されました。解読することが大変な状態から100行未満の簡単なスクリプトに変わったため、非常に保守しやすくなりました。
## スケールアウト
サーバー上で稼働するWebアプリケーションをサーバーレスに切り替えたことにより、サーバーの負荷、適切なスペックを気にする必要がなく、全てはAWSが管理しているため、*サービス
セキュアな SkyWay Auth Token を生成してチュートリアルやってみた
# はじめに
SkyWay では JWT(JSON Web Token)形式のトークンを用いた認証・認可機能が提供されています。
トークンの生成には SkyWay コンソールから取得できる「アプリケーションID」と「シークレットキー」が必要となりますが、これらの値をフロントエンドで保持しておくと不正利用されてしまう恐れがあるため危険です。https://skyway.ntt.com/ja/docs/user-guide/authentication/
SkyWay のチュートリアルにおいては簡単に実装できるようにするため、フロントエンドでトークンが生成されており、以下の注意書きが記載されています。
> 本チュートリアルでは、すぐに通信を試していただくために、トークン生成をフロントエンドで実装していますが、 本来はSkyWay Auth Token はサーバーアプリケーションで生成して client アプリケーションに対して渡すようにするべきです。 第三者に SkyWay Auth Token 生成に必要なシークレットキーを利用して任意の room に入ることができるような
定期的にCloudWatchLogsを集計してSlackに流すLambdaを作る
# 目的
CloudWatchLogsに以下のようなログをためています。“`json
{
“error_message”: “NotLogined(\”session not found\”)”,
“error_name”: “NotLogined”,
“path”: “/api/v1/member/me”
}
“`これを集計してerror_nameごとに何件エラーがあるのかを5分ごとに通知します。
Slackには以下のように通知します。
“`
web1
NotLogined : 3
“`# 構成
AWS LambdaにRubyのコードで集計してSlackに通知するプログラムを作りました。
5分ごとに定期的に実行させたいのでEventBridgeのSchedulerを設定します。
どのCloudWatchLogsを集計して、どのSlackに通知するのかはスケジューラーに設定しています。
以下のような感じです。“`json
{
“user_name”: “slack_notifier”,
“targets”: [
{
AWS lambda (arm) Python3.10.xにライブラリをLayerで追加する方法
## 目的
`aws:lambda(arm)`にランタイム`Python3.10`で好きなライブラリを追加する
例として`pandas`を`lambda`で使えるようにする
## 前提
– 手元のPCのCPUが`intel製`の`x86`
– `aws`のアクセスキーを発行が手元にある状況
– 使用するのは`Python3.10.11`## 方針
1. `EC2`インスタンスを`AmazonLinux2(arm)`で立てる
1. `EC2`にSSHで接続
1. `OpenSSL 1.1.1` をインストール
1. `EC2`に`Python3.10.11`をインストール
1. `pip`で`pandas`をインストールし`zip`化
1. 作成した`zip`を`S3`にアップロード
1. `S3`にアップした`zip`から`lambda`のレイヤーを作成
1. `lambda`にレイヤーを追加
1. `lambda`でバージョン確認## 1.`EC2`インスタンスを`AmazonLinux2(arm)`で立てる
`EC2`インスタンスのAMIを`AmazonLin
serverless-aws-alias プラグインで “Error: Cannot find module” が発生する原因と対処
serverless-aws-aliasを公式ドキュメントに従ってインストールし、sls deploy を実行しようとすると、 “Error: Cannot find module” が発生したので、原因と対処方法をまとめる。
## エラー発生までの経緯
公式ドキュメントに従って、プラグインをインストール。
https://www.serverless.com/plugins/serverless-aws-alias
“`terminal
npm install –save-dev serverless-aws-alias
“`
試しに関数のデプロイを実行(他にリソースはなし)。“`yaml
# serverless.yml
functions:
hello:
handler: functions/hello.lambda_handler
events:
– http:
path: hello
method: get
“`
“`terminal
sls deploy
“`
エラー発生。
`
API GatewayからPubSubバックエンドLambaに接続する。
## はじめに
前回までは以下の記事の内容で、Publisher Lambda⇒SNS⇒SQS⇒Subscriber Lambda⇒DynamoDBまでの流れを構築しました。https://qiita.com/kennyQiita/items/e6d3ad182c3d32242c79
今回はこちらの構成に手を加えて、以下のようにUpdateしていきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/552710fc-e926-3807-99cf-8e71dc531009.png)
処理の流れを簡単に説明すると以下のようになります。
1. Postmanを使ってAPIリクエストを送信し、API Gatewayを介してバックエンドLambdaが起動する。
1. LambdaからSNSトピックが配信され、SQSキューに渡った後、Subscriber Lambdaが起動してDynamoDBに新規Itemを追加(Put)する。
1. DynamoDB Streamに
最近ストリーム対応したLambdaでChatGPTを動かす
# ストリーム?
結果を細切れにやりとりする伝達方式のことです。
細かい話
HTTP/1.1 では、Bodyの送り方がストリームかそうでないかの2通りあります。
通常のHTTP/1.1通信は、Bodyを一度に送ります。
ストリームなHTTP/1.1通信[^1]は、Bodyを細切れに送ります。[^1]:レスポンスヘッダに「Transfer-Encoding: chunked」が指定されます。[Transfer-Encoding – HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Transfer-Encoding#%E3%8
APIゲートウェイの代わりに関数URLを使ってみた
## 何故使ってみたか?
とある事情でWeb上からLambda関数を呼ぶ必要が出てきました。
以前だとAPIゲートウェイを使って呼び出すのが普通でした。
ただAPIゲートウェイだと…* APIゲートウェイを設定するのが(私の感覚だと)面倒
* ちょっとしたLambda関数を呼び出すだけには大げさすぎると、ちょっと敷居が高かったのですが、2022年4月6日に関数URLが機能追加されました。
https://aws.amazon.com/jp/about-aws/whats-new/2022/04/aws-lambda-function-urls-built-in-https-endpoints/
これは、
* Lambda関数内で定義するだけで簡単に使用できる
* なので1つの関数URLにつき1つのLambda関数が実行されると、「できるだけ楽したい教」の信者の私はこちらに飛びつきました。
## 使い方
* Lambdaの管理画面から「設定」を選択
* 「関数URLを作成」を選択
![関数URLを作成.png](https://qiita-image-st
AWS Lambda 用ミドルウェアフレームワークの作成方法を middy を題材に検証(2)
[AWS Lambda 用ミドルウェアフレームワークの作成方法を middy を題材に検証(1)](https://qiita.com/Katsumi1972/items/0cfe293543fb82ccefb7)の次の記事となります。
## 目次[5. エラー処理の実装](#5-エラー処理の実装)
[6. 機能の追加](#6-機能の追加)
[7. 基本機能の仕上げ](#7-基本機能の仕上げ)## 5. エラー処理の実装
既にuse(middleware) の onError でエラー処理モジュールを追加していますが、まだ miggy はエラー処理ミドルウェアを処理していません。ここでエラー処理を実装しましょう。
エラー処理のためにコードが増えるため、runRequest プライベート関数を作成しています。miggy5.js
“`js:miggy5.js
const defaultMainHandler = () => {};const MiddlewareFramework = (mainHandler = defaultMainHandler) => {
AWS Lambda 用ミドルウェアフレームワークの作成方法を middy を題材に検証(1)
## 目次
[1. イントロダクション](#1-イントロダクション)
[2. ミドルウェアフレームワークの基本構造と概要](#2-ミドルウェアフレームワークの基本構造と概要)
[3. ミドルウェアの登録](#3-ミドルウェアの登録)
[4. パイプライン処理](#4-パイプライン処理)
[次の記事](https://qiita.com/Katsumi1972/items/d8e89d347a3f1bd11d4f)に記載
5. エラー処理の実装
6. 機能の追加
7. 基本機能の仕上げ## 1.イントロダクション
このドキュメントは、[`middy`](https://middy.js.org)のcoreモジュールを参考にして、実験的なミドルウェアフレームワーク「miggy」の開発チュートリアルです。middy/coreのソースコードを逐次的にコピーしながら、ミドルウェアフレームワークの仕組みを理解していきます。ただし、middy/coreと完全に同じにすることを目指すのではなく、ミドルウェアフレームワークの基本機能を理解する程度ま
Slackに入力したテキストを使ってLambdaで画像を生成して返す
\# 生成AIの話は出てきません
# TL;DR
Slack WorkFlowのフォームに入力したテキストを使って
Lambdaで画像を生成(ベース画像にテキストを描画)してSlackに投稿するBotを作ったよつまり…
**これが**
![スクリーンショット 2023-06-23 18.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564850/98924b77-22cc-d670-5ffa-56546ddbc70d.png)**こうじゃ!!**
![スクリーンショット 2023-06-23 18.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564850/e9e31e9e-be28-4b61-1bb4-c18bd10cf933.png)
# 環境
Slack: 有料アカウント(Slack APPとWorkFlowBuilderを利用するため)
Amazon SNSとAmazon SQSでPubSubの仕組みを実装する
## 構成図
以下のような仕組みをつくっていきたいと思います。
![スクリーンショット 2023-06-26 121400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/b633bd0b-1c44-2c12-dba6-e359bde851e6.png)
PublisherのLambdaはコンソールから「Test」実行し、SNSトピックをPublishし、SQSでキューに追加された後に、SubscriberのLambdaが起動します。SubscriberのLambdaではメッセージに含まれる内容をDynamoDBに追加します。### 前提条件
* Administrator権限を持つAWSアカウント
* LambdaはPython3.8で記述以下の順番で内容を記載していきたいと思います。
1. SNSトピックの設定
1. SQSキューの設定
1. DynamoDBの設定
1. Publisher Lambdaの中身とSubscriber Lambdaの中身
1. DynamoDBとC