- 1. 【S3】イベント通知におけるオブジェクトキーのエンコードに関する注意点と解決策
- 2. AWS LambdaでLINE⇒Slackにメッセージ連携したメモ
- 3. LINE NotifyとAWSを用いた定期自動送信の実装
- 4. 【Go, AWS】低予算APIサーバー構築を最初から最後まで【Golang, Lambda, DynamoDB, API Gateway, Cognito】
- 5. Lambda(AWS Lambda)について
- 6. LambdaにLine BOTを作ったメモ
- 7. Lambda Node.js serverlessを使うほどでもないちょっとした関数を書きたいときのDocker環境を作ってみた
- 8. SES→SNS→Lambdaでバウンスが行われたときに、Lambdaのテストで使えるイベントJSON
- 9. AWS Lambda の alias と $LATEST をそろそろ理解する
- 10. Lambdaを使ってs3のzipファイルを解凍してみた話(更新中)
- 11. lambda ローカルPC(Mac)で作成したNode.jsのプロジェクトファイルをzip化してアップロードする方法
- 12. 古いCDKでLambdaがデプロイできない原因(の一つ)
- 13. PulumiでAPI Gateway + Lambda(Go)をデプロイしてみた
- 14. AWS LambdaでPythonの外部ライブラリを設定する方法
- 15. Alexaでシャッフル睡眠を促してくれるアプリを作ってみたい
- 16. Provisioned Concurrencyを使ってみての一意見
- 17. 【DR対策】AWS 国内東西リージョンでウォームスタンバイ戦略の構成管理を容易にする
- 18. Lambda の provisioned concurrency をオートスケーリングする方法がある(ことを知って驚いただけの話)
- 19. Lambda@Edgeで脆弱性対策
- 20. Arm64版のAWS LambdaでGoogleのAIモデル「Gemma」を動かす
【S3】イベント通知におけるオブジェクトキーのエンコードに関する注意点と解決策
# 背景
AWSを使用している開発者にとって、S3のイベント通知を処理するLambda関数は一般的なユースケースです。しかし、オブジェクトキーに半角スペースが含まれている場合、S3はこれをプラス記号にエンコードして通知を送信します。
このエンコードにより、Lambda関数にはエンコード後のオブジェクトキー名が渡され、開発者が予期しない問題に直面する可能性があります。例えば、S3のイベント通知で起動するLambda関数で、イベントデータからオブジェクトキーを取得し、何らかの処理をするとします。
Lambdaにはエンコード後のキー名が渡されるので、開発者はオブジェクトキーを適切に処理することができず、期待しない動作が発生する可能性があります。
(S3から当該キーのダウンロードに失敗する、など)# 解決策
この問題を解決するためには、オブジェクトキーをLambda関数内で適切にデコードする必要があります。Pythonの場合、urllib.parse.unquote_plus関数を使用して、エンコードされたオブジェクトキーをデコードすることができます。
このメソッドを使用する
AWS LambdaでLINE⇒Slackにメッセージ連携したメモ
Lambda関数でLINEのメッセージを受信してSlackに通知する手順をまとめておきます。
自分用メモ。## 前提
– 開発環境:Cloud9
– OS:Amazon Linux 2023
– Pythonバージョン:3.10## Slack側準備
### 動作環境作成
自分が管理者権限を持つワークスペースと投稿先のチャンネルを作成しておきます。
改めて説明することは特にない。### Slackアプリの作成
外部からSlackにアクセスするため、窓口となるアプリを作成します。
[Slack の bot を自作する(AWS Lambda + API Gateway)](https://qiita.com/landwarrior/items/dfac36a1aadac9ab0cd5#slack-app-%E3%82%92%E4%BD%9C%E6%88%90)記載の手順を参考にSlack Appを作成しました。が、今回はLINE⇒Slack連携なのでApp作成後は「Event Subscriptions」の設定は不要です。### Webhookの追加
App作成後、左メニュ
LINE NotifyとAWSを用いた定期自動送信の実装
# 1. はじめに
LINE Notify APIを使ってメッセージを送信するPythonプログラムを作成しました.さらに,AWSを用いてそのプログラムを自動で定期実行できるようにしました.駆け出しエンジニアの私でも1日で0から作成することができたので,ぜひ参考にしてみてください.プログラムはGitubにも公開しています.https://github.com/vivy-phtela/line_notify
# 2. 開発のきっかけ
アルバイトリーダーの私はLINEグループに定期的にシフト提出のリマインドを送信する必要があるのですが,いつも忘れてしまいます…これをどうにか自動化できないかと考えていたところ,LINE Notifyを見つけました.# 3. LINE Notifyでトークンを取得
LINE NotifyとはLINE公式が提供しているAPIで,連携するとLINE Notifyという公式アカウントを介して通知を送ることができます.公式ドキュメントは[こちら.](https://notify-bot.line.me/doc/ja/)
### STEP1:
【Go, AWS】低予算APIサーバー構築を最初から最後まで【Golang, Lambda, DynamoDB, API Gateway, Cognito】
:::note
* `Go` -> `Python`差し替え編
* クライアント(`Vue.js`)編執筆中です。
::::::note warn
価格・安全性など重要事項は随時ご自分で調べ、自己責任で作業をしてください。
筆者はいかなる損害について責任を負いかねます。
:::## はじめに
低予算(規模が十分小さければ無料)で[REST APIサーバー](https://qiita.com/masato44gm/items/dffb8281536ad321fb08)を作りましょう。DBあるよ!
## 概要
まず、低予算で推奨されるのが [**サーバーレス**](https://business.ntt-east.co.jp/content/cloudsolution/column-414.html) です。
厳密性を無視して簡単に言うと、 **常時待機するのではなく、必要な時だけ動作するサーバー** というイメージです。低予算でいける理由がこれでわかりますね。思ったよりやること、というよりかは扱わないといけない機能が多いです。
![AWS_Rest.drawi
Lambda(AWS Lambda)について
# はじめに
こんにちは!開発部のMです。
今回はサーバーレスサービスの一つである「Lambda」についてご紹介します。# Lambdaとは
FaaSサービスの一つです。本来、アプリケーションを開発するためには自社内でサーバを準備しなければなりません。しかし、FaaSではインターネットを介してサーバを利用できるため、サーバレスな開発が実現します。
これはアプリ開発者によるサーバ管理が不要、存在を意識する必要がないということであり、サーバがなくてもアプリ開発ができるという意味ではありません。# AWS Lambdaの特徴
AWS Lambdaでは、まず実行したいアプリケーションコードをLambda関数で開発し、Lambda上にデプロイします。するとアプリケーションが実行可能になります。### サポート言語
Java、Go、PowerShell、Node.js、C#、Python、Rubyなど
その他のプログラミング言語を使用できるようにするための Runtime API も提供されています。### 処理のトリガー
* **ファイル処理:** Amazon Simple
LambdaにLine BOTを作ったメモ
Cloud9環境でLambda(Python)にLine Botを作る手順をまとめておきます。
例によって自分用。ちなみに自動応答や一斉配信、リッチメニュー等は公式アカウントの機能で実現できます。今回はSlackとの連携やデータ収集機能を追加する予定なのでLambdaで実装しました。
## 前提
– OS:Amazon Linux 2023
– Pythonバージョン:3.10
– [LINE Messaging API](https://developers.line.biz/ja/services/messaging-api/)## LINE側準備
### LINE公式アカウント作成
まずは[LINE公式アカウント](https://www.lycbiz.com/jp/service/line-official-account/)を作成します。複数人での管理を前提とするならメールアドレスで登録しておきましょう。
Lambda Node.js serverlessを使うほどでもないちょっとした関数を書きたいときのDocker環境を作ってみた## 概要
Lambdaにて小規模なコードを記載したい場合にちょっと楽できるようなDocker環境を作ってみました。
## 発端
小規模な処理(例えばSESのバウンス情報をSNSからLambdaを経由してSlack通知したい場合)をLambdaで使いたい場合、下記のようなジレンマがある。
– Lambdaのブラウザのエディタで書くのはなんかテンションが上がらない、普段から慣れてるエディタを使いたい。。。
– serverlessだとリッチ過ぎる、学習コストもかかる。。。
– 慣れてるエディタで書こうとしてローカルPCのNode.jsを使って書くと、複数の開発者がいる場合バージョン合わせが大変。。。Dockerならこの辺を一挙に解決できるのではと思い今回環境を作ってみました。
## 御託はいい、早くその環境をよこせ
もちろんどうぞ!
↓こちらから取得いただけます。完全にフリーで利用いただけます。おそらく利用方法はREADMEを呼んでいただければ大丈夫だと思います!https://github.com/miriwo0104/nodejs_20_lambda_local_d
SES→SNS→Lambdaでバウンスが行われたときに、Lambdaのテストで使えるイベントJSON
## 概要
SESで送ったメールがバウンスし、SNSのトピックを通じ、サブスクしているLambdaを動かして何かしらの動作を行いたい場合にLambdaのテストのイベントJSONに記載して使う事のできるイベントJSONの内容を考えたので記載しておく。
## 内容
下記にイベントJSONの内容を記載しておく。
“`json
{
“Records”: [
{
“EventVersion”: “1.0”,
“EventSubscriptionArn”: “arn:aws:sns:EXAMPLE”,
“EventSource”: “aws:sns”,
“Sns”: {
“SignatureVersion”: “1”,
“Timestamp”: “1970-01-01T00:00:00.000Z”,
“Signature”: “EXAMPLE”,
“SigningCertUrl”: “EXAMPLE”,
“MessageId”: “95df01b4-
AWS Lambda の alias と $LATEST をそろそろ理解する
Lambda の function versionについて、流石にそろそろ理解する。
## Function version のまとめ
– `$LATEST`
– version 4
– version 3
– version 2 <- alias `dev` とか - version 1 ここで、`$LATEST`をpublishすると、、、 - `$LATEST` (現在 versinon5 との差分はなし) - version 5 - version 4 - version 3 - version 2 <- alias `dev` は変更なし - version 1 🌟🌟🌟 **`$LATEST` は aliasではない!** なお、Lambdaをfunction versionを指定せずに呼び出すと、`$LATEST`が呼び出される。 ## Provisoined concurrency について alias (e.g. `dev`)の指定は可能。 ![image.png](https://qiita-image-store.s3.ap-northeast-
Lambdaを使ってs3のzipファイルを解凍してみた話(更新中)
サーバー上のアクセルログを毎日zip化してs3に投げてます。(アクセスログ以外、いくつ他のファイルも同じzipファイルに保存されます。)
普段このアクセルログを使わないので、それでも問題ないですが、3月一度このアクセルログに対して履歴分析を行います。
zip化されたので、直接分析できないです。毎回s3からzipファイルをs3からダウンロードして、ローカルで解凍して、必要なファイルだけを洗い出し、またs3にアップロードします。結構時間かかりますね…なので、今回Lambdaを使ってzipファイルの一括処理を行いました。
# アクセル権限
Lambda関数を作成時、実行ロールが聞かされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617964/cb1188c2-7b1f-a13d-a56e-82ebb25cc384.png)プロジェクトに既に適切なロールがありますので、それを使いました。
もし、まだ使えるロールがない場合、「AWS ポリシーテンプレートから新しいロールを作成」
lambda ローカルPC(Mac)で作成したNode.jsのプロジェクトファイルをzip化してアップロードする方法
## 概要
ローカルPCで作成したランタイムNode.jsのプロジェクトファイルをzip化し、lambdaの処理に反映する方法を簡単にまとめる。
## 前提
ローカルPCでnpmコマンドが実行できること。
筆者はローカルPCのNode.jsのバージョン管理はVoltaを使用しており、Volta導入段階でnpmコマンドは実行できるようになった。
また、ランタイムはNode.js 20を使う。## 方法
1. 任意の場所にプロジェクトファイルを格納するディレクトリを作成する。
“`
mkdir notice_slack_function
cd notice_slack_function
“`1. 下記を実行してローカルのNode.jsのバージョンを20系にする。
“`
node -v
volta install node@20
node -v
volta list
“`1. 下記を実行してNode.jsのプロジェクトを初期化する。(`-y`オプションは初期化時に問われる質問にデフ
古いCDKでLambdaがデプロイできない原因(の一つ)
## 背景
以下のようなことが起きました– 古いバージョンのCDKでリソースをデプロイしようとした(新規スタック作成・既存スタック更新)
– CDKの中でLambdaリソースを定義している
– そのLambdaのランタイムはまだサポートされている
– にもかかわらず、「Lambdaのランタイムがサポート外」というエラーでデプロイできなかった### 環境
– Node.js: `12.22.2`
– CDK: `1.119.0`### 実際のログ
“`io
5:41:20 AM | CREATE_FAILED | AWS::Lambda::Function | LogRetentionaae0aa…b201efdd8aFD4BFC8A
Resource handler returned message: “The runtime parameter of nodejs14.x is no longer supported for creating or updating AWS Lambda functions. We re
PulumiでAPI Gateway + Lambda(Go)をデプロイしてみた
# はじめに
以前から気になっていたIaCツールであるPulumiでAPI Gateway + Lambda(Go)のサーバレスなAPIを作成してみたので記事にしたいと思います。### Pulumiとは
TerraformやCloudFormationなどと同じくIaCツールとなっていて、YAMLだけでなくGoやPython、TypeScriptなどで記述できることやAWS、Google Cloud、Azureなど様々なクラウドサービスに対応してることも特徴です。
さらにPulumiには**Pulumi AI**というChat GPTのように自然言語でチャットするだけでIaCのコードを生成してくれる機能があります。### そもそもIaCとは
IaC(Infrastructure as Code)はインフラ(サーバー、ネットワーク、ストレージ)をコードで定義して管理する手法のことです。手動での管理と違ってコードで記述するので、手作業でのミスがなくなることやGitなどを用いることで管理の効率化が可能になっています。# 開発環境
M1 MacBookで開発しています。# 手順
AWS LambdaでPythonの外部ライブラリを設定する方法
# 概要
Lambdaでは、Python標準ライブラリとAWS SDK for Pythonしか使用できません。
また、Lambda上ではpipによる外部ライブラリのインストールもできません。そのため、必要なライブラリは自分で調達してくる必要があります。
ここでは、外部ライブラリの調達と設定方法について解説します。# 手段
Lambdaでは外部ライブラリを配置できる場所が2つあります。* Lambdaレイヤー
* Lambda関数ごとのコード置き場(フォルダ/ファイル構成)配置場所はどちらでもよいのですが、枯れた技術(アップデートの頻度が少ないモジュールや外部ライブラリ)はLambdaレイヤー配置するのが、一般的な作法なようです[^1]。
今回は**Lambdaレイヤーに外部ライブラリを配置**する方法を取ります。# 外部ライブラリを取得する
外部ライブラリは公開先からダウンロードしてよいですが、“`pip install -t“`でローカルに落としてしまうのが手っ取り早いです。AWS環境で完結させるなら、外部ライブラリ調達用にCloud9を1つ作成し、
Alexaでシャッフル睡眠を促してくれるアプリを作ってみたい
長らく愛用してきたシャッフル睡眠を促してくれるAlexaアプリが公開停止されて私の安眠が失われてしまったので自作しようと思います。
# 作成予定のスキル
認知シャッフル睡眠法をサポートしてくれるアプリを作成予定です。
具体的には数秒おきにランダムな単語を読み上げるようにするシンプルなアプリです。> 認知シャッフル睡眠法とは
>
>・カナダの認知科学者リュック・ボードウィン博士が考案した睡眠法
>・「大脳皮質が理論的な活動をしているうちは、脳が『まだ寝てはいけない』と
判断する」という仕組みを利用して、あえて何の脈絡もないイメージを連想し、大脳皮質の理論的な活動を止め、脳が“眠りのスイッチを入れても大丈夫”と判断するように導いてゆくもの
>・適当な単語を次々とイメージすることで睡眠を妨げる思考が抑制されることで眠りにつける# 事前準備
## 1. アカウント作成
alexa developer consoleにアクセスしアカウントを作成してログインします。## 2. アプリ作成
スキルの作成から今回開発するアプリを作成します。
“`text: 設定内容
アプリ名: シャッ
Provisioned Concurrencyを使ってみての一意見
# はじめに
Provisioned Concurrencyを使用したDynamoDBに接続するLambdaで性能に関する問題が発覚しました。
それについて試したことや記事タイトルの通り、Provisioned Concurrencyについて考えさせられる部分があったため、記事にしました。## 経緯
前述の通り、Provisioned Concurrencyを使用したDynamoDBに接続するLambdaでWebAPIを作成していました。
Provisioned Concurrencyの効果を最大限にしたいので、Provisioned Concurrencyの準備中にハンドラー外の初期化処理に加え、DynamoDBクライアントをグローバルで初期化したり、DynamoDBと接続を行いコネクションを事前に確立させておきました。
以上の施策により、後続リクエストのスループットの向上を試みました。## ぶつかった問題
上述の通り、Provisioned Concurrency準備中に諸々準備しておくことで後続リクエストのスループットが向上できる認識でした。
しかし、実際負荷試験ツ
【DR対策】AWS 国内東西リージョンでウォームスタンバイ戦略の構成管理を容易にする
## はじめに
とあるシステムでAWSの東京リージョンをプライマリリージョン、大阪リージョンをセカンダリリージョンとした、ウォームスタンバイ戦略の環境を構築しました。
この中で環境の更新など、構成管理について工夫した点を紹介します。## ウォームスタンバイ戦略とは
ウォームスタンバイ戦略は、ディザスタリカバリ(DR)戦略の中の1つです。
ディザスタリカバリ戦略は4種類あり、以下のAmazon Web Services ブログで詳しく紹介されています。https://aws.amazon.com/jp/blogs/news/disaster-recovery-dr-architecture-on-aws-part-1-strategies-for-recovery-in-the-cloud/
どの戦略を選択するかはRPO、RTO、コストなどの観点で決定します。
今回のシステムでは以下の理由により、ウォームスタンバイ戦略を選択しました。
1. RPO/RTOが2時間であり、「バックアップ&リストア」や「パイロットライト」では間に合わない
1. マルチサイトほどの可用
Lambda の provisioned concurrency をオートスケーリングする方法がある(ことを知って驚いただけの話)
## 答え
Application autoscaling を使えば良い。
ref. [[Lambda]Provisioned Concurrencyを使用率でAutoScalingさせる](https://dev.classmethod.jp/articles/lambda-support-provisioned-concurrency-autoscaling-2/)
## 感想
知らなかった。。。
(AWS management console のLambdaのページには表示されてない。)
Lambda@Edgeで脆弱性対策
# Lambda@Edge で脆弱性対策
## あらすじ
新たなウェブサイトの脆弱性への攻撃手法が出回り始めたけど、すぐには改修できない。
システムの外部で攻撃防御を行うにはWAFを使うことになるけれど、AWS WAFは高い。
(個人のウェブサイト維持費としては。会社ならどうということはないのですが)特定の条件に合致するリクエストを弾くだけならば Lambda@Edge でも可能では?
ということで試してみた話。
今回はApache log4jの任意のコード実行の脆弱性(CVE-2021-44228)を対象とします。
https://www.jpcert.or.jp/at/2021/at210050.html## Lambda@Edgeとは
Amazon CloudFront の機能で、CDNエッヂで実行可能なLambda関数。
ウェブサイトへアクセスがあった都度実行させて、その結果を返すことができます。
ということはWAF的な動作も可能なはずです。## 前提条件
脆弱性対策を行いたいウェブサイトで Amazon CloudFront (CDN) を利用している
Arm64版のAWS LambdaでGoogleのAIモデル「Gemma」を動かす
本記事は以下の記事内にて作成したLambda関数を、arm64アーキテクチャに対応させるものとなります。合わせてご確認ください。
https://qiita.com/densenkouji/items/3d8c3d045f101cd0b61c
# はじめに
先の記事にて一先ずはLambdaでGemmaを動かすことができました。
ただ、AWS Lambdaはアーキテクチャをarm64に設定することもできます。
前回は特に意識していなかったためデフォルトのx86_64になっていましたが、今回はLambdaのアーキテクチャをarm64に指定して動かしてみます。# arm64アーキテクチャへの移行について
それでは、arm64アーキテクチャへ移行させるため、Lambdaやdockerのアーキテクチャ設定に関して修正します。
具体的には以下の点を修正しています。
– dockerイメージをビルドする際、arm64用にビルドする
– Lambda関数作成時にアーキテクチャとして、arm64を指定する# 修正したコード
前回の記事でイメージのビルドやLambda関数の作成に使用したスクリ