Lambda関連のことを調べてみた2022年02月05日

Lambda関連のことを調べてみた2022年02月05日

Lambdaでaws_s3.query_export_to_s3 関数を使用したクエリデータのエクスポート

# はじめに

> Aurora PostgreSQL DB クラスター からデータをクエリし、Amazon S3 バケットに保存されているファイルに直接エクスポートできます。そのために、Aurora PostgreSQL によって提供される aws_s3 PostgreSQL 拡張機能を使用します。

### 参考
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/postgresql-s3-export.html

ソースコードのみの紹介となりますが、実行するためには以下の設定が必要です
・postgresにアクセスするためにLambdaをpostgresと同じサブネットに配置するか、通信できるサブネット(SG、ACLの設定)には配置が必要
・VPC内でLambdaを実行するためのロール設定
・postgresからS3へアップロードするためのIAMポリシーの設定

# コード
“`python
import psycopg2

def lambda_handler(event.context)

元記事を表示

Lambda で外部ライブラリ(psycopg2)を使用する

# はじめに
Lambdaでpsycopg2を使うためには、デプロイパッケージを作成しアップロードする必要があります。
(複数のLambda関数で使用する場合など、Lambdaレイヤーを作成し共通部品化する方法もあります。)

### 参考

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-package.html

# デプロイパッケージの作成

“`bash
$ mkdir -p hoge-function/package
$ touch hoge-function/lambda_function.py
$ pip install psycopg2-binary -t ./hoge-function/package/

**フォルダ構成 (zip前)
hoge-function
| lambda_function.py
| package
| psycopg2-binary
| psycopg2-binary-info

$ cd ./hoge-function/package/

# psycopg2

元記事を表示

Firecrackerがバージョン1.0になったので正式版になったRaspberry Pi OS (64-bit)で試してみました。

Firecrackerがバージョン1.0になったとのことです。おめでとうございます。

https://www.publickey1.jp/blog/22/awsvmfirecracker10aws_lambdaaws_fargate.html

同じタイミングでRaspberry Pi OSの64-bit版が正式版になったとのことです。おめでとうございます。

https://www.raspberrypi.com/news/raspberry-pi-os-64-bit/

64-bit版のRaspberry Pi OSを使って、Firecrackerを試してみました。Raspberry Pi 4を使っています。(3ではうまく動かなそうです)

# Raspberry Pi OSの準備

Raspberry Pi Imagerを使ってOSをmicroSDカードに書き込みます。

`Raspberry Pi OS (other)`から`Raspberry Pi OS (64-bit)`が選択できるようになっています。

![image.png](https://qiita-image-

元記事を表示

AWS Lambda 内容整理

#【AWS Lambda 内容整理】
実務で Lambda × Python でコードを書くことになりました。
そのための内容整理です。

##Lambda:サーバーレスコンピューティングサービス
– サーバー無しで、コードだけで実行できるサービス
– サーバーの管理が不要
– 稼働している時間だけが課金対象
– 負荷がかかると自動スケーリングをおこなってくれる。
– 言語やメモリの制限はある。

##想定される使い方
– zipファイルを作成して、直接アップロード
– 処理を実行後、S3に保存する。
– S3のIAMポリシーを追加する。
– 定期的にLambda関数を実行したい。
– Amazon EventBridge と組み合わせる。
– 毎月1日に実行。

元記事を表示

ローカルでAWS Lambdaをいい感じにデバッグする方法

# はじめに

サーバーレスなどでLambdaを使うとかっこいいけど、ローカルで実行しづらく
かと言ってAWSにデプロイして動かしてデバッグするというのは時間と手間がかかるので
なんかいい方法ないかなと模索した結果のまとめです。

# 前提
* LambdaをPythonで書いている(多分他の言語でも大丈夫)
* デプロイは、ECR経由でDockerイメージで実施
* [lambci/docker-lambda](https://github.com/lambci/docker-lambda)を使う

# 方法
## 依存ライブラリなどなし

READMEにあるように、

“`bash
docker run –rm -v “$PWD”:/var/task:ro,delegated \
lambci/lambda:python3.8 lambda_function.lambda_handler
“`

とするだけ。
`event` に渡したいJSONパラメータがあるのであれば、`lambda_handler` の後に指定するだけよいです(これもREADMEにある通り)
この辺は、い

元記事を表示

Lambdaの明瞭な出力ログ [Python, Node.js]

#はじめに
Lambdaの出力ログは、CloudWatchLogsで確認しますが、json形式の明瞭なログ出力を書き留めます。

#Python
DynamoDBの数値を取り出す際、データとしてDecimal(数値)として取り出されますが、json.dumpsを実行すると、エラーが起きました。
そのため、Decimalを取り除くロジックをつけています。

`ensure_ascii=False`は、文字化け対策です。

“`python
import json
from decimal import Decimal

# json形式でログを出力するため、Decimalがある場合取り除く
def decimal_to_int(obj):
if isinstance(obj, Decimal):
return int(obj)

def lambda_handler(event, context):

print(“Received event:” + json.dumps(event, default=decimal_to_int, ensure_ascii

元記事を表示

Terraformを使ってEC2インスタンスの自動起動/自動停止環境を構築する

# はじめに
もう何番煎じかわかりませんが、EC2インスタンスの自動起動・停止を実現する環境が欲しくなったので構築します。
会社で検証に使っているAWS環境が1週間ごとに消えてしまう仕様なので、毎回手動で設定しなくてもいいように**Terraform**を使って環境構築の自動化を行いました。

# 実現したかったこと
* AWS EC2インスタンスの自動起動・停止を行い、利用料を削減する
* 平日の9:00〜21:00の間だけ稼働させる。ただし休日に作業したい際や、夜通し動かしたいといった要件に備えて柔軟にスケジュール設定できるようにしておく
* 検証環境のため、対象サーバは基本全部。インスタンスが増えてもコードや設定をいじらずに対応できるようにする。また一応特定のインスタンスをターゲットにできるようにしておく
* できる限り最小限の稼働で環境構築を行う

# 成果物と使い方
以下のGitLab.comに今回作成したコードをあげています。
「とにかく使えればいい」場合はこちらからcloneなりforkしてREADMEを参照の上お使いください。
突貫工事のため、コードが汚いですがご了承く

元記事を表示

API Gateway の API バージョン指定(ベースパス)で Lambda の処理を分岐させる

## はじめに

ある API で v2 と v3 を並行稼働させることになりました

URL は以下の想定

– https://xxx.com/v2/some_items
– https://xxx.com/v3/some_items

v2 と v3 を個別の REST API やステージとして構築すれば簡単に実装できます

しかし、この API では API_KEY を使った使用量制限などを行っているため、
個別に実装してしまうと、 v2 と v3 で API_KEY を別々にしなければなりません

– 全ユーザー用に新しい API_KEY を発行する必要がある
– ユーザーは新しい API_KEY を使う必要がある
– 新旧どちらの API_KEY も発行できるようにシステム改修する必要がある

そこで、 v2 も v3 も同じ REST_API 、ステージに設定した上で、
ユーザーがアクセスしてきた URL によって処理を分岐させることにしました

これにより、ユーザーは同じ API_KEY のまま URL を変えるだけで移行が可能になります

この実装のため、検証した内容

元記事を表示

Amplify CLIでLambda関数を定期実行させる方法

# Amplify CLIでLambda関数を定期実行させる方法
## 注意点
先に注意点を書いておきます。
`amplify add function`の時点で、定期実行の設定をする必要があります。
「え、更新すればいけるやろ?」と思いますが、私はできませんでした。
また、調べても`amplify add function`の時点で設定している記事しか見つかりませんでした。
**もし後からでも設定できる場合は、教えてください。**

## Amplify CLIでLambda関数を定期実行させる方法
**amplifyの環境が設定済みという前提で書いています。**
もし`amplify`がわからない場合は、こちらを参考にしてください。
[Amplify SNS Workshop](https://amplify-sns.workshop.aws/ja/)

最初に`amplify add function`を実行します。
そうすると、以下の基本的な設定の質問が出てきます。
### 基本的な設定

“`bash
? Provide a friendly name for your r

元記事を表示

AWS Lambda Layer(レイヤー)を作成する方法

## Lambda Layerとは
複数のLambda関数に、共通の外部ライブラリやビジネスロジックを追加できる仕組みです。
1つのLambda関数に、5つまでLayerを追加できます。
しかし、Layerのサイズには、制限があります。

## Lambda Layerを作成する方法
### nodejsディレクトリを作成する
ディレクトリ名は必ず**nodejs**にする必要があります。
(それ以外の名前では、ダメだと思います。)

### 必要なライブラリをインストールする
“`bash
npm init
npm install (必要なライブラリ)
“`
`npm init`と`npm install (必要なライブラリ)`を行い、`node_modules`ディレクトリが作成され、中にインストールしたものが入っていれば大丈夫です。

### zipにしてアップロードする
上記で作成した`nodejs`ディレクトリをzip形式にして、アップロードします。
アップロードする場所は、`AWSのコンソール`→`Lambda`→`レイヤー`→`レイヤーの作成`の順に進むと、アップロー

元記事を表示

Visual Studio Code 上でAWS Lambda が編集できるようになるまで

### Visual Studio Code 上でAWS Lambda 編集できるようになるまで

(自分用のメモとして残しておきます)
タイトルの通りです。
AWS Lambdaを学習中ですが…Lambdaだとソースが見にくい…
ので、Visual Studio Code 上で以下のことができるようにしました。
 ・ソースのダウンロード&直接編集
 ・テストの実行
 ・(編集した)ソースのアップロード

### 事前準備
(1) Visual Studio Code のインストール
  https://azure.microsoft.com/ja-jp/products/visual-studio-code/

(2) Visual Studio Code のプロキシ設定(※必要な場合のみ)     
  (記載例:http://userName:password@proxy.xxxTsts.jp:8080 )
  (記載場所) ![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518095

元記事を表示

AWS Organizations 内のアカウントリストを組織構造と一緒に csv 出力する

## はじめに
AWS Organizations でマルチアカウント管理していると、アカウントの一覧を定期的に取得したいときはありませんか?

アカウント情報だけではなく、所属する OU の情報も一緒に出力する方法を紹介します。

## 実はコンソールから csv をダウンロードできる
コンソール上でも通知が出ているように、最近組織内のアカウントリストを csv 出力することができるようになりました。アクションから「アカウントリストをエクスポート」でダウンロード可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1333de19-3353-0d66-e9af-375ee8c6ba97.png)

これはこれでとても便利なのですが、2022年1月時点では以下の問題があります。

### コンソールからしかダウンロードできない
AWS CLI や SDK 経由でダウンロードができないため、定期的に取得したいといったケースでは自動化が困難です。以下のドキュメントに記載が

元記事を表示

チャットからLambda関数の実行を予約する

#はじめに
LINEからLambda関数の指定時刻実行を予約したかったのでLambda関数を作成しました。

#つくるもの
###イメージ
![訓練時.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2457109/4e3230bb-7a9b-559f-befb-7b9a711ebe3d.png)

* LINEから受け取ったメッセージを基にLambdaでboto3を実行し、指定のLambda関数を実行予約するEventBridgeルールを作成します。
* 定期実行ではないため実行予約1つにつき1つのEventBridgeルールを作成します。
* ルール名は<Lambda関数名-実行時間>とし、この関数から作成された事を示すためのTagと実行時刻(UTC)Tagを付与します。
* Tagを参照しこの関数から作成されたEventBridgeルールの中で、実行済みのEventBridgeルールをチャットから一括削除出来るようにします。
* 実行対象に取れる関数のリージョンは1つのみです(

元記事を表示

Amazon Connect と、LambdaやLexとの連携方法

#はじめに
下記のような構成で、connectのシステムを構築した際、
お問い合わせフローから、LambdaやLexを使用する際のパラメータの渡し方などのまとめます。

パラメータを`問い合わせ属性`と呼びます。

>Amazon Connectでは、顧客とのやり取りはそれぞれ問い合わせ として処理されます。やり取りには、音声通話、チャット、または Amazon Lex ボットを使用した自動的な対話があります。
各問い合わせは、特定のやり取りに固有の、いくつかのデータを保持することができます。このデータは、問い合わせ属性としてアクセスされます。
例:
– 顧客の名前。
– エージェントの名前
– 電話やチャットなど、問い合わせに使用されるチャネル
– その他

![スクリーンショット 2022-01-30 18.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b63d3fb3-8a3b-7ace-2fe4-82400f4d9b26.png)

#Connectのお問い合わせフロ

元記事を表示

lambdaとは一体何者か。

##目的
めも。labmdaを名前しか知らなかったので軽く調べた。

##lambdaとは

* サーバーレスでプログラムを実行できるAWSのクラウドサービス。
* あるイベントが発生したら、プログラムを実行するなどの関数(=lambda関数)を
定義しておくことで、自動でプログラムを実行してくれる。

* 使用状況は、関数に対するリクエスト数とコードの実行時間に基づいて決まる、従量課金制。
無駄なコストがかからない。

##そもそも”サーバーレス”とは
Webサービスの開発に必要なサーバーの構築や保守をしなくても、サーバー上でプログラムを実行できること。

“レス”と言っているが、サーバーが必要ないわけではなく、管理が必要ないことを指す。
サーバーレスにも種類があってその中の一つがFaaS(Function as a Service)と呼ばれるサービスである。

lambdaもFaaSである。

##FaaSの特徴

* イベントドリブン式
* イベントごとに実行されるコードを書く
* 開発費用を抑えられる
* イベントが発生すると処理が動くので、動いた分だけ払えばOK

元記事を表示

【AWS】Go Lambdaのローカル開発環境を作る ( aws-sam-cli + M1mac )

# はじめに

`aws-sam-cli`を利用すれば、手元の端末内にLambdaの実行環境を再現して、動作検証できる。
手元でコードを修正しながらその場で動作確認できるため、ディプロイの手間とLambdaの費用を削減できる。
nodejsとpythonの導入手順は多い中、Golangのドキュメントが少ないように感じたため、ここで纏める。

### やること

* 開発用にarm版Golangをローカル環境にインストールする
* `aws-sam-cli`でローカル環境にLambdaとAPIGatewayを構築する

### 前提

* arm版(M1チップ)の`macOS`環境をベースに説明する (goenv導入部分以外は大差ないはず)
* Z shell (zsh) をベースに説明する (環境変数の通し方以外は大差ないはず)
* Dockerは既にインストールしてあるものとして説明する

# もくじ

1. Golangをセットアップする
* aws-sam-cliをセットアップする
* ローカル環境でLambdaを起動する

# 1. Golangをセットアップする

#

元記事を表示

Lambda Layersで自作モジュールを共通ライブラリ化する [Python,Node.js]

#はじめに
Lambda Layersを用いることで、モジュールを共通ライブラリとして、複数のLambdaで使用できるようなので、PythonとNode.jsのパターンで方法をまとめます。

メリットとして、Lambdaのソースコードの量を減らすことができること、各Lambdaごとにモジュールをアップする手間がなくなることがあげられます。

Lambda Layersについて
>Lambda レイヤーは、追加のコードやデータを含めることができる .zip ファイルアーカイブです。レイヤーには、ライブラリ、 カスタムランタイム 、データ、または設定ファイルを含めることができます。レイヤーを使用すると、コードの共有と責任の分離を促進し、ビジネスロジックの記述をより迅速に繰り返すことができます。

#自作モジュールのディレクトリ構造

Lambda Layersにアップロードされたモジュールは、`/opt`の領域に展開されます。
そのため、指定されたディレクトリ(`下記の表参照`)にPythonモジュールを格納してアップロードすることでLambdaを実行した際にモジュールとして自動的に読み込

元記事を表示

AWS Lambdaから別Lambdaを呼び出す際にPickle形式でデータをやりとりする

Lambdaから別Lambdaを実行するのはアンチパターンにも載っている方法ですが、やってみたので書いておきます。

https://aws.amazon.com/jp/blogs/news/compute-operating-lambda-anti-patterns-in-event-driven-architectures-part-3/

# 呼び出し元

FooのdataclassをいくつかリストにしてPickle形式にシリアライズして送信先のLambdaに送信しています。
返り値もPickleで返ってくるので読み込んでプリントします。

“`py
import json
import pickle
from typing import List
from dataclasses import dataclass
from datetime import datetime
from base64 import b85decode, b85encode

import boto3

@dataclass
class Foo:
i: int
d: datetim

元記事を表示

AWS Lambda(Python)でmultiprocessing【Python,Lambda】

# はじめに

Lambda高速化のためのmultiprocessingを使った並列処理です。パッと使いたいときの自分用テンプレです。

# 実装
LambdaのPython3.6です。

“`python
import json
import boto3
from multiprocessing import Process, Pipe
import time

def worker(conn, num):
# ここに処理を記述
# boto3を使う場合
# session = boto3.Session()
# s3 = session.client(‘s3′)
print(num)
response = f’process: {num}’
time.sleep(1)
conn.send(response) # 処理結果
conn.close()

def lambda_handler(event, context):

results = []
processes = []

元記事を表示

AWS Lambdaで環境変数のTZは指定しないほうが良いかもしれない件

##はじめに
Lambdaで現在日時を取得する際は、
リージョン関係なくデフォルトでUTCとなっています。

そのため業務等では扱いやすいようにJSTに変換して運用するかと思いますが、
その方法で2022年1月現在、よく見かけるのが2パターン存在します。

本記事はPython3.9を使用していますが、
他の言語に読み替えていただいても内容は問題ありません。

##1.Lambdaの環境変数でタイムゾーンを設定する方法

まずは環境変数なしで取得してみます。

![スクリーンショット 2022-01-28 18.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/2f5a7920-6d0c-6973-6e14-63b00bc016e7.png)

“`python
from datetime import datetime

def lambda_handler(event, context):

current_at = datetime.now().strftime(‘

元記事を表示

OTHERカテゴリの最新記事