- 1. 2022年にpythonとAWS Lambdaで作ったもの
- 2. API Gateway経由でLambdaを呼び出す
- 3. Lambdaローカル開発環境構築手順
- 4. Lambdaから直接Parameter Storeの値を取得する
- 5. EventBridgeを使ってLambda関数を月初のAM8:00に実行する
- 6. AWS CDK – API Gateway(REST)+ Lambda Authorizer
- 7. AWS LambdaでTypeScriptのコードを動かす最小の構成 with AWS SAM
- 8. 【小ネタ】Lambda の Dockerイメージをコードから作成した話
- 9. AWS CDK – Node.js 18 TypeScript での Lambda 実装
- 10. [Python / AWS lambda] AWS Lambda実行時にnumpyのRuntime.ImportModuleError
- 11. lambda Amazon API Gateway APIキー認証を用いた認証付きAPIを作ってみる
- 12. PythonであるLambda関数から別のLambda関数を呼び出す
- 13. AWS Lambdaの再試行回数によって処理を分岐させる方法
- 14. 非同期処理で立ち上げたlambdaのDLQはFIFOキューに入れられない
- 15. クラウドで堂々のシェア1位!AWS(Amazon Web Services)
- 16. AWS SAMでGo+API Gateway+Lambda+DynamoDBのサーバレスAPI構築をIaC化した
- 17. ハイパフォーマンスLambdaエコノミクス
- 18. AWS TimestreamのtimeカラムをLambdaでJSTに変換する際のTips
- 19. AWS SDK V3 のDynamoDBで、いくつか動作確認した話(AWS SDK V2 → V3 移行Tips)
- 20. AWS SSM RunCommandを利用してlambdaからEC2インスタンスを操作する
2022年にpythonとAWS Lambdaで作ったもの
# 1. まえがき
去年作ったプログラムのまとめ記事となります。# 2. 競馬関係のTwitter BOT
2022年の初めに、[「AWSではじめるインフラ構築入門」](https://amzn.asia/d/9bYYI0P)の本を購入し、アプリを作成
自分でも作成して見ようと、興味がある競馬関連のTwitterのBOTを4つ作成・1号機(今日のハクサン地方競馬出走情報Bot)
#園田競馬 9R ハクサンチェイス
— 今日のハクサン地方競馬出走情報Bot (@hakusan_keiba) December 30, 2022
・2号機(明日のメイショウ冠名馬中央競馬出走情報と今日の競走結果情報BOT)
今日のメイショウ冠馬中央競馬結果
中山05R メイショウゴルシ 10着(6番人気)
阪神09R メイショウフンケイ 6着(1番人気)
阪神09R メイショウカイト 7着(12番人気)
阪神09R メイショウミツヤス 11着(9番人気)
阪神12R メイショウツツジ 7着(15番人気)— 明日のメイショウ冠名馬中央競馬出走情報と今日の競走結果情報BOT (@MeishoBot) December 28, 2022
– 3号機(マカオ競馬の日本人騎手レース結果Bot)
https://twitter.com/macau_keiba/status/16094690722778972
API Gateway経由でLambdaを呼び出す
## 概要
API Gatewayを自身で構築したことがなかったので、簡単なものを構築してみた。
/test(GET)でLambdaを呼び出せるようにする。## 手順
1. Lambda関数を作成
2. API GatewayでREST APIを作成
3. APIをデプロイする
4. APIにアクセス## Lambda関数を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255243/22611345-9295-9f9e-80ec-393dec386d6b.png)
コードは初期のまま
“`
export const handler = async(event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify(‘Hello from Lambda!’),
};
return response;
};
Lambdaローカル開発環境構築手順
下記ブログを参考に、Lambdaのローカル開発環境構築手順をまとめる。
# 本記事執筆時の作業環境
– Windows11 Pro 22H2
– Windows Terminal
– PowerShell 7.3.1# Pythonインストール
下記を参考にPythonをインストールする。~~https://blog.pyq.jp/entry/python_install_221102_win~~
https://starter-guide.od.pythonic-exam.com/ja/latest/python-setup/install-py39-win.html
2023/01/02追記:LambdaランタイムのPythonのサポートが3.9までだったため、
参考記事を差し替えた。https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html
下記コマンドでPythonのインストールを確認
Lambdaから直接Parameter Storeの値を取得する
今まではboto3を使ってParameter Storeから値を取得していました。
“`python
import boto3ssm = boto3.client(‘ssm’)
response = ssm.get_parameters(
Names=[Parameter Store Key],
WithDecryption=True
)
“`
が、以下のアップデートにより、直接Parameter Storeなどから値を取得できるようになったので、実際に試してみた際のメモです。https://aws.amazon.com/jp/about-aws/whats-new/2022/10/aws-parameters-secrets-lambda-extension/
# 必要な権限
SDKを使って実装していたときと同様に、Lambdaの実行ロールに以下の権限を渡す必要がある。
* `ssm:GetParameter`
* `kms:DecryptSecureString` (SecureStringを取得する場合に必要)# 必要なレイヤーの追加
## AW
EventBridgeを使ってLambda関数を月初のAM8:00に実行する
個人で運用しているLambda関数を月初に動かす際に調査した内容のメモです。
# やりたいこと
今回やりたいことは『毎月1日の8:00に特定のLambda関数を実行する』こと。EventBridgeを使うことでcron形式での記述ができるが、タイムゾーンがUTCであるため時差を考慮する (JSTの9時間前を指定する) 必要がある。
`cron(0 0 1 * ? *)` のように月初を指定すると、9時以前に実行できなかったり、`cron(0 23 31 * ? *)` みたいに記述すると月末が31日まである場合は対応できるが、28日とか30日の場合にルールが複数出来そうで、可能な限り簡潔に記述したかった。
# 実現方法
EventBridgeのユーザーガイドを確認してみると、`L`を使うことで月末・週末を表現することができるらしい。
https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule-schedule.html
> * The L wildcard in the Day-of-mont
AWS CDK – API Gateway(REST)+ Lambda Authorizer
# 前回記事
– [AWS CDK – Node.js 18 TypeScript での Lambda 実装](https://qiita.com/takmot/items/83326c5e3e3213038dde)
# 前提条件
– IaC は CDK(CDK v2)
– Lambda のランタイムは Node.js 18(拡張子は.mjs)
– Lambda の実装は TypeScript(AWS SDK for JavaScript v3)
– API Gateway の API タイプは REST API# ファイル 構成
[前回](https://qiita.com/takmot/items/83326c5e3e3213038dde)から Lambda Authorizer を追加している。
“`
├─ src/
│ ├─ lib/
│ │ ├─ api-gateway/
│ │ │ ├─ handlers/
│ │ │ │ └─ sample-api/
│ │ │
AWS LambdaでTypeScriptのコードを動かす最小の構成 with AWS SAM
# はじめに
AWS Lambdaってお手軽に使えるんでしょ?と思いながら簡単なLambdaを書いたのですが、初心者の私はTypeScriptの知識もないために、デプロイするまでが難しかったです。
AWS SAM CLIを使ってテンプレートから作成するとゴチャゴチャしていて分かりにくいと感じたので、Lambdaとして実行するための必要最小限の構成を手動で作る手順を残しておきます。
# 開発環境
– Windows 10
– Git bash
– Node v16.18.1 / npm 8.19.2
– aws-cli/2.9.9 Python/3.9.11 Windows/10 exe/AMD64 prompt/off
– SAM CLI, version 1.67.0# 基本的なセットアップ
SAMでは `$ sam init` で対話型でテンプレートからプロジェクトを生成することが可能ですが、今回は使わずに一からプロジェクトを作ります。
ちなみに、Windows版のAWS SAM CLIをインストールすると、bashで `$ sam` を使うためにはひと工夫必要でし
【小ネタ】Lambda の Dockerイメージをコードから作成した話
# はじめに
[Releaseタグ作成からEKSへのデプロイを自動化した話](https://qiita.com/ijufumi/items/c8c54c2295baf04113b2) でやった内容のうち、 `Lambda` に焦点を当てた内容です。
載せているコードは一部だけなので、全体を見たい方は上記の記事から辿ってください。
# 環境
* `Kubernetes`: `1.24`
* `AWS CDK for Golang`: `v2.56.1`# やったこと
## Lambda用のコードを準備
`lambda` ディレクトリに、必要なファイルを用意します。
`Dockerfile` のみ載せています。
他は、`Github` リポジトリを参照。* `Dockerfile`
“`Dockerfile
FROM public.ecr.aws/lambda/python:3.9COPY . ${LAMBDA_TASK_ROOT}
COPY requirements.txt .
RUN pip install –upgrade pip && pip3
AWS CDK – Node.js 18 TypeScript での Lambda 実装
# 前提条件
– IaC は CDK(CDK v2)
– Lambda のランタイムは Node.js 18(拡張子は.mjs)
– Lambda の実装は TypeScript(AWS SDK for JavaScript v3)# ファイル 構成
`cdk init`で自動生成される構成から多少変更している。
[実践!AWS CDK #7 ファイル分割](https://dev.classmethod.jp/articles/cdk-practice-7-split-file/)を参考に、AWS リソースごとにリソース定義ファイルを分割している。
Lambda のコンパイル用に別途`tsconfig.json`を用意する。“`
├─ src/
│ ├─ lib/
│ │ ├─ api-gateway/
│ │ │ ├─ handlers/
│ │ │ │ └─ sample-api/
│ │ │ │ └─ index.ts // Lambdaコード
[Python / AWS lambda] AWS Lambda実行時にnumpyのRuntime.ImportModuleError
# エラー内容
“`bash:Cloudwatch Logsのロググループで確認
[ERROR] Runtime.ImportModuleError: Unable to import module ‘src.handlers.filename’:IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!
Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.We have compiled some common reasons and troubleshooting tips at:
https://numpy.org/devdocs/user/troubleshooting-importerror.html
Please note and check
lambda Amazon API Gateway APIキー認証を用いた認証付きAPIを作ってみる
# 概要
– lambdaとAPI Gatewayを使ってAPIキー認証を使った認証付きAPIを作ってみたので方法をまとめる。
# 情報
– 筆者はMacOSの端末を使っている。
# 方法
## lambdaの準備
1. 下記の情報でlambda関数を作成する。
– 関数の種別:一から作成
– 関数名:returnHello
– ランタイム:Node.js 18.x
– アーキテクチャ:x86_64
– 基本的な Lambda アクセス権限で新しいロールを作成
1. 関数作成時に作成されたindex.mjsの内容は特に変更せず、Testを実行して、200のステータスと「Hello from Lambda!」の文字列が返されることを確認する。## API Gatewayの準備
1. lambdaの「関数の概要」から「トリガーを追加」をクリックする。
![returnHello_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0
PythonであるLambda関数から別のLambda関数を呼び出す
最近あるLambda関数から別のLambda関数を呼び出す処理をする際に少し調べたのでメモ。
# 環境
| ランタイム | Python 3.9 |
| — | — |# 今回の想定ケース
特定のLambdaから別のLambdaをまるごと呼び出す処理を想定。
今回は、以下の`testFunction01`から`testFunction02`を呼び出すような処理を実現していく。“`python:testFunction01
def lambda_handler(event, context):
print(‘[testFunction01] testFunction01’)
“`“`python:testFunction02
def lambda_handler(event, context):
print(‘[testFunction02] Called by testFunction01’)
return {‘message’: ‘called by testFunction01’}
“`# 実現方法
基本的には[inv
AWS Lambdaの再試行回数によって処理を分岐させる方法
業務の都合でAWS Lambdaの処理を再試行回数によって分岐させる必要が出てきたので、その実装を含めシェアします。
# 実現できることのイメージ
※Lambdaは最大2回まで再試行を設定可能です。“`Java
if (再処理回数 == 0) {
// 処理A
} else if (再処理回数 == 1) {
// 処理B
} else {
// 処理C
}
“`# とりあえず考えられる方法
基本的に以下の方法は **「Lambdaが再試行されるときはリクエストIDが同じになるのでそれをどうカウントするか」** という考え方が基になっています。なお、リクエストIDはUUIDっぽいので、他のリクエストIDとは被ることはないという前提です。
– CloudWatch Logsのログを読み取ってリクエストIDをカウントする ([参考](https://zenn.dev/shimo_s3/articles/c2895880138d19))
– DynamoDBなどのDBに記録しつつそれを読み取ってリクエストIDをカウントする ([参考](https:
非同期処理で立ち上げたlambdaのDLQはFIFOキューに入れられない
当たり前といえば当たり前かもしれないですが、設計時点で気が付かなかったのでメモ。
非同期実行の例としてS3, API Gatewayを想定しています。青い矢印は正常に疎通が取れます。
![名称未設定ファイル.drawio (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882979/1db77976-0ba3-d5dd-fd2d-12ffa2bb4715.png)
# なぜこうなるのか
非同期実行でLambdaへ処理が流れてきたときに、Lambda内で並列的に同時実行されるためだと思います。要するに、流れてきたときには処理A, 処理B, 処理C, …という順序で流れてきたものが、再試行後の失敗時にはその順序が(例えば) 処理C, 処理A, 処理B, …と変わってしまっている可能性が高いためです。
そのためFIFOキューの特徴である順序を保つということが保証できなくなり、仕様上送信できないのではないかと思われます。
**※ですが、console上ではFIFOキューをDLQとし
クラウドで堂々のシェア1位!AWS(Amazon Web Services)
![aws.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/fc7040ff-915a-e4de-99bd-f8262b8c4bfc.jpeg)
エスプリフォートでは積極的に新しい事を取り入れつつ、ビジネスシーンに合わせたインフラ及びシステム構成、セキュリティ、BCP対策などを考慮したご提案を心がけています。
これら磨きあげた技術力が、お客様に高いクオリティでシステムを提供する一助になっています。## はじめに
[今では当たり前!クラウドコンピューティング導入](https://qiita.com/espritfort_tech/items/4b5fc2c8b8a4b733ac88)
[新たなアプローチ!サーバーレスアーキテクチャ](https://qiita.com/espritfort_tech/items/83883ece946bf38f8bac)上記記事でご紹介した通り、クラウドサービスは今ではあらゆるシステムにとってなくてはならないサービスの一つになっていることは、既
AWS SAMでGo+API Gateway+Lambda+DynamoDBのサーバレスAPI構築をIaC化した
# はじめに
前回Goで作成したAPIの環境構築をSAMでIaC化しました。https://qiita.com/tkhs1121/items/7b193dcce19539f16761
# 環境
MacBook Air M1
開発言語 Go# 手順
AWS CLIとSAM CLIをインストールします。
“`shell
brew install awscli
brew tap aws/tap
brew install aws-sam-cli
“`AWSコンソールのIAMからアクセスキーを作成して、クレデンシャルを設定します。
“`shell
aws configure
“`前回のソースディレクトリにSAMの`template.yaml`を追加します。
https://github.com/tkhs1121/go-serverless-app-3
## ソースコード
“`yaml:template.yaml
AWSTemplateFormatVersion: ‘2010-09-09’
Transform: AWS::Serverless-2016-10-
ハイパフォーマンスLambdaエコノミクス
# はじめに
遅くれるとよくないもの、それは納期とAPIのレスポンスです。
納期はお客さんや仲間からの信頼を失い、APIのレスポンス遅延はエンドユーザを失います。
webAPI構築にLambdaを利用するシーンについてパフォーマンスを改善していくのかをお話できればと思います。Lambdaエコノミクスと謳っているとおり、Lambdaの前段にApiGatewayを配置したときのよくある構成をベースに、ボトルネックとなりなりうる箇所を紹介していきます。
![無題のプレゼンテーション_-_Google_スライド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389053/60af2620-170b-51d3-fd75-77e33adbd0b3.png)# 対象読者層
・DynamoDB使ってみたいけど何に気をつければいいかわからない人
・RDS Proxy使ってみたいけど何に気をつければいいかわらかない人
・同じ構成でパフォーマンスがでなくて困ってる人# 負荷試験をはじめるまえに
まず、プロ
AWS TimestreamのtimeカラムをLambdaでJSTに変換する際のTips
# 問題
Timestreamにて“`time“`カラムが下記のように“`タイムゾーン無し&文字列“`として出力される場合があります。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/d7f9fc4f-e0fa-2736-f51a-c3b3d9380dc2.png)
Lambdaで時間処理を行う場合、文字列では不便ですのでJSTに変換しなければなりません。
ですが、単純に“`str → date“`では変換できない事象が発生しましたので共有したいと思います。
できれば、レイヤーも追加せず簡単に行う方法かつ、python3.9に合うモダンな方法にしたい。# 解決策
そのままの状態では、dateフォーマットに合わないことがわかりました。
最初に文字列として取得できるので、**末尾の桁数を調整**することでやや力技ですが解決できました。“`python
from datetime import datetime
from zoneinfo impor
AWS SDK V3 のDynamoDBで、いくつか動作確認した話(AWS SDK V2 → V3 移行Tips)
# はじめに
https://qiita.com/Syoji_Yonemoto/items/e619d8199b7c8354248f
V3移行の動作確認の初手に、Firehoseを選んだせいかもしれないですが、V2で使ってたメソッドの互換があるか保証がないことが分かったので、普段、Lambdaで利用するAPIについては一通り、動作確認をしていっています。
今回は、DynamoDB編です。
# 結論
DynamoDBに関しては、私が普段使うメソッド群については、問題ありませんでした。
# V2 と同じ使い方で問題なく動作確認できたメソッド
+ putItem
+ batchGetItem
+ query
+ updateItem
+ updateTable# 余談
性能試験や、TTL未実装の時などには、createTableやdeleteTableも実行していた時もありましたが、日常的に使う物でもなく、その時がきたら追試をします。# まとめ
DynamoDBくらい主要どころになると、しっかり下位互換もされているようです。
引き続き、小ネタシリーズとして、
AWS SSM RunCommandを利用してlambdaからEC2インスタンスを操作する
# 目標
オートスケールで動かしているEC2インスタンス全てに対してLambda関数を実行することで、SSM RunCommand経由でコマンドを実行する# ドキュメント
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html# lambda関数の作成
ランタイム: Python3.9
アーキテクチャ: x86_64# コード
“`
import boto3
def lambda_handler(event, context):
boto3.client(‘ssm’).send_command(
Targets=[{‘Key’:’tag:Name’, ‘Values’: [‘ssm-test’]}],
Parameters={
‘commands’:[
‘touch test.txt’
],
},
Documen