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

Lambda関連のことを調べてみた2022年01月30日
目次

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(‘

元記事を表示

AWS IoT Coreに証明書を使わずユーザー名/パスワード認証で接続する

AWSのIoT Coreに接続するためには、証明書が必須と思っていましたが、カスタム認証を使うと、ユーザー名とパスワードで認証ができます。

証明書を使った認証は、IoT Coreが自動でやってくれますが、ユーザー名とパスワードによる認証の場合は、認証用のLambdaを作成して認証を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180441/616cd98d-052f-48e1-3502-978d313630e1.png)
※図は公式ドキュメントからの引用です。

MQTT接続で行う場合には以下の制約があります。

* 接続ポートはMQTTSの8883ではなく443である必要がある
* ALPN拡張に`MQTT`の値を指定する必要がある

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/custom-auth.html

> オーソライザーを呼び出すには、MQTT とカスタム認証を使用して AWS I

元記事を表示

lambdaからECS:RunTaskを使用し、Taskを起動する

業務でLambdaの実行時間に引っかかる処理を切り分けるためにLambda->ECSTask実行を行いました。
ServerlessFlameWorkを使用したNode.js/TypeScript環境でECSのTaskを実行する手順です。
Python3&boto3を使用した記事は[こちら](https://qiita.com/ken992/items/1d4ee5e33c04744d1d1c)です。

## 環境
“`
Node v14.7.0
“typescript”: “^4.1.3”
“serverless”: “^2.23.0”,
“serverless-esbuild”: “^1.17.1”,
“`

## 結論
“`typescript:ecsTask.ts
import { ECSClient, RunTaskCommand, RunTaskCommandInput } from ‘@aws-sdk/client-ecs’;

const client = new ECSClient({
region: ‘ap-northeast-1’,
});

cons

元記事を表示

Serverless Framework

[Serverless Framework](https://www.serverless.com/) とは、AWS などでサーバレスのサービスを作る手順を省略するツール。自分で CloudFormation を書くより簡単。よく似たツールとして AWS SAM というのもある。

インストール。開発に使う node と混ざるのが嫌なので standalone binary を選んだ (実際には node_modules があるとそちらを優先して使うようだ)。~/.serverless/bin にインストールされるので .zshrc の読み込みが必要。

curl -o- -L https://slss.io/install | bash

AWS 環境の選択。AWS_PROFILE や AWS_DEFAULT_REGION の region 設定は無視されデフォルトの region は us-east-1 になるので注意。

export AWS_PROFILE=hoge

## ドキュメントの構成

ドキュメントは https://www.serverless.c

元記事を表示

AWS Lambda は、Amazon SQS、Amazon DynamoDB、Amazon Kinesis をイベントソースとするイベントフィルタリングをサポートしました

# はじめに

https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-lambda-event-filtering-amazon-sqs-dynamodb-kinesis-sources/

> AWS Lambda は、イベントソースとして SQS、DynamoDB、Kinesis のコンテンツフィルタリングオプションを提供するようになりました。イベントパターンのコンテンツフィルタリングでは、お客様が指定したフィルタリング条件の下で、SQS、DynamoDB、Kinesis からのみ Lambda 関数がトリガーされるような複雑なルールを書くことができます。これにより、お客様の Lambda 関数へのトラフィックを減らし、コードを簡素化し、全体的なコストを削減することができます。
>
> お客様は、SQS、DynamoDB、Kinesis をトリガーとする Lambda 関数のためにイベントソースマッピングを作成または更新する際に、最大 5 つのフィルター条件を指定することができます。フィルターの組み合わせは、デフォルトで

元記事を表示

lambda 関数作るときのメモ

### 1. 概要

lambda関数作成するとき、忘れてググるやるまとめる

### 2. 目次
– [1. 概要](#1-概要)
– [2. 目次](#2-目次)
– [2.1. layer の追加](#21-layer-の追加)
– [3. 参考](#3-参考)

#### 2.1. layer の追加

1. `pip install -t {dir_name} {package_name}` でパッケージをdir_nameにインストールする
* dir_name を python にする事で、lambda関数内でパスを指定する必要がなくなる
2. `zip -r9 layer.zip python` で zip化する
3. AWS コンソールからレイヤーの作成→zipをアップロードする
4. arn を取得し、レイヤーの追加でarnを指定する

### 3. 参考
* [Lambda レイヤーの作成と共有](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.htm

元記事を表示

Cloud9でLambdaレイヤーをサクッとつくる(スクレイピング環境構築

# はじめに
Lambdaでスクレイピングしたいですよね。じゃあChromedriverにSeleniumいるね。
そして取得したデータ、良い感じに取りまとめしたいですよね。じゃあBeautifulsoupとかPandasいるね。
という感じで、ピュアではないライブラリやドライバが欲しくなることが多々あります。

で、Lambdaレイヤーつくるかあ。となるのですが
Winで落としてきたChromedriverはそのままでは動かなかったり,
ローカルで作ったzipもレイヤーに上げようとすると「AmazonLinux以外お断り!」とか怒られたりするわけです。
もう全部AWS上で完結してしまいたい。となってAWS経済圏に入り込むわけです。
商売上手(for 開発下手)。

# AWS Cloud9の活用
ということでペアプログラミングでお世話になることの多いCloud9を使います。
それにしてもAWSのサービス名はおしゃれですね。クラウド使って最高にハッピー(Cloud nine)になるだって。

AWS Cloud9にアクセスをして,
↓Create Environmentして…
![

元記事を表示

API Gateway + Lambda + S3で音楽ファイルのタグ情報を取得するアプリを作成する

ローカルに持っている音楽ファイルのタグ情報(曲名・アーティスト名・アートワーク)を取得する簡単なアプリケーションを作成したので、実装の流れを記事にまとめます。
今回はAWSの学習も兼ねて、API Gateway、Lambda、S3(Presigned URL)を組み合わせて実装してみました。タグ情報の抽出には、mutagenというPythonライブラリをLambda内で用いています。

* この記事では主に実装の流れを説明していますが、Presigned URL(以下署名付きURL)、mutagenについても軽く説明しています。
* 機能実装の流れをわかりやすくするため、セキュリティ面の処理の実装を一部省いています(実際は許可されたユーザーだけがAPIエンドポイントにアクセスできるようにする必要があるなど)。そのため、あくまで練習用だと思ってください。

#目次

– 実装機能の構成
– 音楽ファイルをS3にアップロードする
– 署名付きURLとは
– S3バケットの作成
– ロールの作成
– Lambda関数の作成
– API Gatewayの作成
– クライ

元記事を表示

Notion API + LINE + AWS Lambda他でメモ内容をLINEにしゃべらせる

# 野望
相も変わらずNotionをDBに用いたLINE Bot的なものが作りたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/7acc353d-96ab-d5a0-8a5d-289b8e41e0c0.png)

# 前回のあらすじ
Notion APIの前にまずはLINE Messaging APIの検証から始めました。
どうやら用意したLINE公式アカウントで受信したテキストをもとに応答をすることができるようになったっぽいです。
https://qiita.com/DJROU/items/900e3c32b87b5d43d8ed

# 今回やったこと
いきなりNotionを繋げて読み込みと書き込みをできるようにするのは荷が重いので、LINE公式アカウントに対してユーザが送ったテキストをNotionで検索した結果を返せるようにしました。
指定したDBのキーに対する値がゲットできるところまでのお試しです。

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

元記事を表示

Chalice with DynamoDB

## この記事の目的

この記事の目的は、AWS製のサーバーレスフレームワークChaliceとDynamoDBを組み合わせて利用する手順を個人的なメモとして記すことです。

以下の内容を含みます。

– Chalice, DynamoDBともにAWS上で利用します
– Chalice, DynamoDBLocalを用いてローカルマシンでも利用します(長くなるので次回投稿にします)

以下の内容はカバー出来なかったので今後の課題とします。

– ローカル環境でのIDEを利用したデバッグ
– DynamoDB構築のCDKなどの利用(今回はaws-cliコマンドで実行)
– ユニットテスト

## 前提事項

以下のインストールについては済んでいるものとします。

– Python3
– chalice
– aws-cli
– docker-compose

ちなみに、私の環境は以下のようになっています。(2022/1/24時点)

– Python 3.9.7 (pyenv利用)
– chalice 1.26.4
– aws-cli 2

元記事を表示

Lamda作成テンプレートCloudFormation

# はじめに

他のAWSサービスに対して自動操作ができるかなど、試しにLambdaを作ってみる際に、都度IAMロールやログの管理を考慮するのが面倒と感じていました。
なので、必要最小限のリソースをCloudFormationで作ることで、削除時にまとめて消せるようにしました。

# CloudFormation

各部分の解説をし、全体は最後に記載します。

## パラメータ
“`
Parameters:
LambdaFunctionName:
Type: String
“`
`Type: AWS::Lambda::Function`ではFunctionNameは任意ですが、本番使用の関数作成時も想定して、名前を付けられるようにしました。

## ロググループ
対象のLambda関数の出力先ロググループを作成します。

“`
FunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub “/aws/lambda/${LambdaFunctionN

元記事を表示

LocalStackを用いたKinesisをトリガーとしたLambda実行

* LocalStack上で動作するKinesisへのレコード登録をトリガーとしてLambdaを起動し、LambdaからDynamoDBへレコード登録を行う方法についてメモする。

## 構成

![kinesis-trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/fb89f035-75f4-e38c-492d-6b74c842b769.png)

## Kinesis準備

* ストリーム作成

“`shell
aws kinesis create-stream –stream-name test-stream –shard-count 1 –endpoint-url http://localhost:4568 –profile localstack
“`

* ストリーム確認

“`shell
aws kinesis describe-stream –stream-name test-stream –endpoint-url http://local

元記事を表示

AWS Cloud9を使ってGoのコードをLambdaにデプロイする

# はじめに
久々に投稿するのですが、学生時代に投稿した昔の自分のQiitaが(意味不明で)可愛いですね。

今回Cloud9を触ってみたので、「Cloud9でGoのコードを書き、それをLambdaにデプロイするまで」を書いていきたいと思います。

# 目次
– Lambdaの作成
– Cloud9の作成と使い方
– Cloud9からLambdaにGoコードをデプロイ
– デプロイしたLambdaを実行する
– Cloud9を使ってみた所感

# Lambdaの作成
まずはLambda関数を作成しておきます。
手動で作ったのですが、そういえばCloud9の中からcliで作れるのでしょうか。

関数名は`cloud9-demo`にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347108/03661b31-bae4-2735-8bb3-871b0fc5c99e.png)

今回はデモ用に作成したので、

– メモリは512MB -> 128MB
– 最大時間は15秒 –

元記事を表示

Amplify CLIを使って、ローカルで実行&AWSにデプロイ

Amplify CLIを使って、REST APIや静的コンテンツのサーバを立ち上げます。
ローカル環境で実行・デバッグして確認したのち、AWS上にデプロイ・実行します。

ローカル環境でのデバッグには、node.jsとVisual Studio Codeを使います。
AWS上には、API Gateway、Lambda、S3を使います。
上記の橋渡しに、Amplify CLIを使います。

今回使うのは、AmplifyではなくAmplify CLIです。
なぜこのような言い方をしているかというと、Amplifyは、いろいろ自動化してくれているのですが、何をしているかよくわからないので、長期的にメンテナンスがしづらく、バグに遭遇する可能性もあるためです。
なので、Amplify CLIを使って、API Gateway、Lambda、S3を一つ一つ作っていきます。

それと、Amplifyで構築すると、今までS3やAPI Gateway、Lambdaにばらばらで分散していたパーツ群がAmplifyに集約されるので、まとめてみやすくなります。

目指す形は以下の通りです。

![image.p

元記事を表示

CloudWatchAlarmのアラーム発動時間をスケジューリングしました。(EventBridge + Lambda + CloudWatch)

#はじめに
こんにちは、山田です。
今回は、CloudWatchAlarmのアラーム発動時間をスケジューリングしました。

#構成図
EventBrigdeにて、CloudWatchAlarmを無効/有効化する時間帯をスケジューリングする。
Lamandaにて、時間になったら、CloudWatchAlarm無効/有効化アクションを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/686c6f7c-fea9-a093-84ff-8aafd5422b9c.png)

#Lambdaの作成
① AWS管理コンソール -> Lambda -> 関数 -> 関数の作成をクリックする。

② 関数名を入力する。
 ※今回は`「CloudWatchAlarm-enable-action」`と`「CloudWatchAlarm-disable-action」`としました。

③ 使用する言語は`Python3.8`を選択する。

④ 設定 -> アクセスの権限 -> 実行ロール

元記事を表示

Lambda(SAM)からAmazon SNSトピックへpublishを行う方法メモ

* LocalStack上で動くAmazon SNSのトピックに対して、AWS SAM CLIで動くLambdaからpublishを行う方法をメモする。

## 構成
![sam-sns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/ede9f228-fef0-f12c-76cc-62a82f1aefe6.png)

## LocalStack準備

* `docker-compose.yml`

“`yaml
version: “3.8”
networks:
container-link:
name: docker.internal
services:
localstack:
container_name: “${LOCALSTACK_DOCKER_NAME-localstack_main}”
image: localstack/localstack
ports:
– “127.0.0.

元記事を表示

Amplify FunctionsをTypeScriptで書く

早速`amplify add function`していく。

“`:console
❯❯❯ amplify add function
? Select which capability you want to add:
❯ Lambda function (serverless function)
Lambda layer (shared code & resource used across functions)

? Provide an AWS Lambda function name: function名

? Choose the runtime that you want to use: (Use arrow keys)
.NET Core 3.1
Go
Java
❯ NodeJS
Python

? Choose the function template that you want to use: (Use arrow keys)
CRUD function for DynamoDB (Integration with API

元記事を表示

OTHERカテゴリの最新記事