Lambda関連のことを調べてみた2020年06月23日

Lambda関連のことを調べてみた2020年06月23日
目次

AWS Lambda Nodejsのバージョンが8から12に強制アップデートされたら Error: Cannot find module ‘jmespath’ と出る問題

# 要約
AWS Lambdaで利用するnodejsのバージョンが nodejs8 -> nodejs10以降のアップデートすると aws-sdkが組みこまれるようになるため
node_modulesにaws-sdkを含んでいるとエラーになるので、取り除く必要がある

# 本文

nodejs8で書かれたAWS Lambdaスクリプトは非推奨となりました。
AWS Lambdaのnodejs10やnodejs12環境で同じスクリプトを実行すると、以下のようなエラーメッセージが表示される。

“`
{“errorType”:”Runtime.ImportModuleError”,”errorMessage”:”Error: Cannot find module ‘jmespath'”,”stack”:[“Runtime.ImportModuleError: Error: Cannot find module ‘jmespath'”,” at _loadUserApp (/var/runtime/UserFunction.js:100:13)”,” at Object.mod

元記事を表示

Java – ラムダ式を利用するSQLの実行 – SQL Runner

### 1. 基本構想

lambda式とFluent APIを適用してSQLを実行したい。同じコード(ボイラープレート/定型コード)を何度も記述するDAOは避けたい。DAOを作成すると、メソッドが一つのSQL専用になり融通がきかない。時間を無駄にするし、バグも発生しやすい。仕様変更に伴う修正箇所も多くなる。

以下を実現したい。1) SQL文を与えて、2) プレースホルダーに値をセット、3) 結果をDTOに変換する。この3つがSQL実行の本質であり余分なコードはいらない。2)、3)はlambda式で実現する。この機能を、SQL Runner と呼ぶことにする。

“` Java
List list =
SelectorRunner<>(“SELECT ID, NAME FROM EMP WHERE ID = ?”)
.bindParams(preparedStatement -> preparedStatement.setInt(1,103))
.mapResult(resultSet -> {
Emp emp = new Emp();
emp.setId(re

元記事を表示

API Gateway + Lambda のCORS関連エラーの対策

API Gateway と Lambda でウェブアプリのAPIエンドポイントをつくって外部サイトのシステムから呼び出そうとしたらCORS(Cross-origin resource sharing)のエラーになってしまい、設定に躓いたのでメモ

# 基本的な対策
## API Gateway でCORS有効化
API Gateway のアクションからCORSの有効化を設定するのが基本的な対策です。
通常はこれでOKのはず。

## エラーが出て設定が反映できないとき
自分の環境で、以下のようなエラーがでてうまく設定ができませんでした。
`Invalid Response status code specified`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73833/6daf7c6f-67d3-292a-010e-60d04c2f7333.png)

### 対策(レスポンスヘッダーを手動で設定)

1. 上記画面でエラーになった内容をメモ
2. リソースからエラーになっている

元記事を表示

Lambdaのトリガーの作成中にエラーが発生しましたの対処法

#Lambdaでトリガーを指定したい

###エラー内容

LambdaでS3のputをトリガーを指定しようとした時

#####trigger の作成中にエラー が発生しました: Configurations overlap. Configurations on the same bucket cannot share a common event type. (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; Request ID: 8659097E5FCA60E1; S3 Extended Request ID: 2PrYTEd8BysODQscbugs/nK2CtkwOQPjw4JXuWgP6rF18PrrvTkq7cgsbs5gDDwKZdB+9qXAE1o=; Proxy: null)

というエラーが出ました。

同じバケットで同じイベントタイプでは作れませんよ的な内容です。

##同じトリガーの関数を消すだけではダメ

消しても同じエラーでした。

##解決策

トリガーで指定していた

元記事を表示

laravelのbref を利用し、lambda にデプロイする

# はじめに
laravelで制作したアプリをサーバーレス用ライブラリbrefを使い、AWSにデプロイしました。デプロイは、serverless frameworkがやってくれます。

ちなみに、参考にした先輩の記事はこちら。

**Laravelのサーバレス用ライブラリbrefを使い、lambdaでhello world
PHP**
https://qiita.com/umihico/items/64fcf159f68ebd866170
#アプリ作成とbrefインストール

“`terminal
$ composer create-project –prefer-dist laravel/laravel laravel-demo #プロジェクト作成
$ cd laravel-demo
$ composer require bref/bref #肝のbrefインストール

“`
#編集するファイル
.env

“`.env
– SESSION_DRIVER=file
+ SESSION_DRIVER=array
+ VIEW_COMPILED_PATH=/tmp/storage

元記事を表示

node.js(express)でDB(Postgresql)にアクセス

# 背景

今日はバックエンド関連。

これまでバックエンド(主にDBアクセスまわり)は、ほぼJavaでしか書いたことがなかったので、
node.jsでDB(Postgresql)にアクセスする際には、どんな方法があるのか簡単に調べてみる。

ついでに、接続先のDBがAWSのRDS(Aurora/Postgresql)だった場合に、現時点ではどういう構成が最適なのかについても調べてみようと思う。

# 実装

まずは、node.jsでDB(Postgresql)にアクセスする際の実装(コーディング)方法について調べて試してみる。

## 調査

ネットを漁って軽く調べてみた感じ、以下の2つのパターンがありそう。

1. ORマッパーとしてSequelizeというライブラリを利用してDBにアクセスする
2. pg(node-postgres)を直接使って、自分でSQLを書いてDBにアクセスする

参考)
https://sequelize.org/
https://node-postgres.com/

ネット上の記事を見る限り、Sequelizeを使うケースのほうが多いような印象(ま

元記事を表示

ECSとLambdaでTwitter botを作ってみた(自動RTとInstagramから自動投稿)

# この記事について
この春、緊急事態宣言下で全国の動物園、水族館は休園を余儀なくされていました。
そんな中、各園が少しでもお客さんに楽しんでもらおうとSNS上で動物たちの様子を発信していました。

それが「#休園中の動物園水族館」というタグです。

このタグの投稿が少しでも広まるようにという思いから、
このタグ付きのTwitter及びInstagramの投稿を自動でリツイート及びツイートするbotを作りました。

元記事を表示

[AWS] CloudFront + Lambda@Edge で IP 制限をかける

# はじめに

[こちらの記事](https://qiita.com/ksh-fthr/items/ee2b7880a9e6c0fc6f88) の 「[まとめにかえて](https://qiita.com/ksh-fthr/items/ee2b7880a9e6c0fc6f88#%E3%81%BE%E3%81%A8%E3%82%81%E3%81%AB%E3%81%8B%E3%81%88%E3%81%A6](https://qiita.com/ksh-fthr/items/ee2b7880a9e6c0fc6f88#まとめにかえて))」で触れたとおり、 CloudFront へのアクセスに対して IP アドレスで制限をかける方法について触れる。
実現にあたり、本記事では CloudFront と Lambda@Edge を利用する。

# 注意

本記事は 2020年6月21日 時点の情報です。
ご覧になられた時点で UI が変更されている可能性がありますので、その点ご注意ください。

# 前提

– [こちらの記事](https://qiita.com/ksh-fthr/items

元記事を表示

SQS → Lambdaのリトライ処理について整理してみた

2018年の6月より、AWS LambdaのイベントソースとしてSQSが選択できるようになりました。

今回はLambdaのイベントソースでSQSを選択し、Lambda側で処理が失敗した場合、どのようにリトライ処理が行われるのかについて整理してみました。

# リソースの作成

今回は、SNS → SQS → Lambda の構成で検証していきたいので、それぞれのリソースを作成いたします。

## SQS

“inu-queue”というキュー名でキューを作成いたします。キューの種類は標準で各設定値はデフォルトです。

そして、”inu-dlq”というキュー名でDLQ(デッドレターキュー)用のキューも作成します。こちらもキューの種類は標準で各設定値はデフォルトになります。

2つのキューを作成したら”inu-queue”のDLQの設定を行います。

DLQの設定方法は、AWSコンソール画面だと以下の手順で設定することになります。

inu-queueのキューにチェックをつける → [キューの操作]をクリック → [キューの設定]をクリック → デッドレターキューの設定で[再処理ポリシー

元記事を表示

【AWS入門】初めてのLambdaはTranscribe♪

これは備忘録のために、参考のとおりにやってみた記録です。
参考記事はすっきり書かれていてわかっている人なら簡単なんだと思いますが、AWS初心者には難しい内容でした。そのあたりを泥臭く解説したいと思います。
なのでやったことは、最終的に参考記事のまんまです。
【参考】
・[S3 → Lambda → Transcribe → S3 で文字起こしパイプラインを作成する](https://qiita.com/leomaro7/items/ad9726391d547ea3bcfd)
###やったこと
・1 S3に(input)用のバケットを作成
・2 Lambdaを開く
・3 Lambda関数の定義と意味
・4 CloudWatch Logsの見方
・5 S3に(output)用のバケットを作成
・6 Lambda修正
・7 実行ロールの変更の仕方
・8 Lambda functionを編集する
・9 Transcriptionの確認の仕方
###・1 S3に(input)用のバケットを作成・5 S3に(output)用のバケットを作成
AWSの左上のサービスを押すと全サービスが表示されて、こ

元記事を表示

Alexaにlambda連携させて中野区のゴミの日を教える

# やりたいこと
Alexaからlambdaを呼び出して中野区のゴミの曜日を返します。
全く触ったことのない人でも一から作れるように書きました。

![alexa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/479c5032-72bd-f550-e10d-bcc353a8af8c.png)

[ALEXAで開発入門してみたので自分なりに纏めてみる](https://qiita.com/godan09/items/6dafc3da51b10532dbe1)
こちらの記事を参考に作ってみました。
細かいところまで説明されていてとても勉強になりましたが、
AWSの仕様変更のためか途中でつまづいたのでその辺りも本稿で記載します。

# 必要なもの

* [Amazon開発者ポータル](https://developer.amazon.com/ja/)のアカウント取得 (Alexaのスキル作成に必要)
* [AWSマネジメントコンソール](https://aws.amazon.com/jp/c

元記事を表示

ServerlessFrameworkでLambdaからFargateコンテナを呼びだす

Lamdaからboto3でFargateのコンテナを起動する際の手順です。
ググると簡単にできそうなのですが、私はなぜか盛大にハマってかなり時間がかかったので注意点を記載します。

## serverless.ymlの設定

まず、IAMでECSアクセスのポリシーを付与します。

“`serverless.yml
provider:
iamManagedPolicies: # Optional IAM Managed Policies, which allows to include the policies into IAM Role
– arn:aws:iam::aws:policy/AmazonECS_FullAccess
“`

なお、上記のポリシーが付与されていないと以下のようなエラーが出力されます。
翻訳すると「実行が許可されていません。」ということらしいです。

“`
An error occurred (AccessDeniedException) when calling the PutRule operation: User: arn:aws:

元記事を表示

AWS Lambda 新機能「EFS 統合」の検証と、新しいユースケースの開拓

2020/6/16のアップデートで、AWS Lambda から Amazon Elastic File System (EFS) が利用可能になりました。
本記事ではこの EFS との統合機能を検証し、今回のアップデートによって生まれる新しいユースケースとは何かを考えます。

# アップデートの概要
AWS Lambda 関数が Amazon Elastic File System(EFS)をマウントできるようになりました。
これまでの EFS の主たる用途は、複数の EC2 インスタンスで共有するファイルシステムです。
端的に言えば、1つまたは複数の同時実行される Lambda 関数、従来から対応している EC2 と Fargate を跨ってデータ (ファイル) を永続的に保存および共有できるようになります。

# 前提条件 (構成図)
EFS は VPC 内のリソースとなりますので、VPC Lambda である必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21198

元記事を表示

Zoomのクラウドレコーディング完了をAPI, Lambda経由でSlackに通知する

# これは何
zoomのクラウドレコーディング完了を、slackの特定のチャンネルに通知
今回は

– Slack App (Incoming Webhook)
– AWS Lambda(python)
– AWS api gateway
– Zoom App (Outgoing Webhook)

などを使用します。
※練習も兼ねて手順を細かめにメモしています。

▼クラウドレコーディングが終わってしばらくすると通知が来る。それだけ。こっからカスタマイズしていきたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/4d649e2b-805c-603c-412a-a3d118fec9cb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/a9d862d6-63b0-baa0-498f-b95f2eab059d.png)

### 作成のきっかけ
– エ

元記事を表示

AWS Lambda ローカル実行(デバッグ)、デコレータで例外処理統一、引数チェック等 with Python

AWS Lambdaをローカルで実行するサンプルを書きました。Dockerは使いません。

やること
1. 環境変数の読み込み pip install python-dotenv しておくこと
2. lambda_handlerに渡す event引数を記述したJSONファイル読み込み
3. デコレータで例外処理、引数チェックなどを統一する。複数のAWS Lambda関数を使うときに、共通ファイルにデコレータ関数を定義し、各々の関数でlambda_handlerを呼ぶたびにデコレータ関数を呼び出すようにする。そうすると、失敗時にイベント引数をs3等に保存しておけば再処理したり、またはイベント引数の共通チェックを行うという処理を統一できる。

#サンプル
./.env
./.event.json
./lambda_handler.py

.env 環境変数設定用

“`.env:.env
LogLevel=DEBUG
“`

.event.json イベント引数

“`json:.event.json
{
“body” : “{\”key\” : \”valu

元記事を表示

AWS S3バケットからファイルを取得し、Lambdaのローカルに保存する

#ゴール
S3バケットに格納してあるファイルをLambdaのローカル(/tmpディレクトリ)に保存したいと思います。
今回はバケット(MyTestBucket)に保管したファイル(test_file.txt)を使用します。
ランタイムはPython 3.8です。

##ソースコード
“`
import os
import boto3

s3 = boto3.resource(‘s3’)

def lambda_handler(event, context):

bucket = s3.Bucket(‘MyTestBucket’)
bucket.download_file(‘test_file.txt’, ‘/tmp/test_file.txt’)
return os.listdir(‘/tmp/’)
“`

##結果
osモジュールのlistdir関数で、Lambdaの/tmpディレクトリにファイルが保存されているか確認しています。
テスト実行後のコンソールに表示された結果は以下の通りです。
![rapture_20200615181536.png]

元記事を表示

AWS LambdaでFFmpegを使って動画からサムネイルを作成する

S3にアップロードしたMP4からサムネイルを作成する方法を雑にまとめました。

## 手順

### 1. FFmpegをダウンロード
MP4からサムネイルを取得してくれるライブラリを取得する。
コイツが何者かの詳細は調べてみてください。

[公式](https://johnvansickle.com/ffmpeg/)から `ffmpeg-git-amd64-static.tar.xz`(2020年6月時点で最新)をダウンロードする。
ダウンロードしたzipファイルにはいろいろはいっているが、今回は`ffmpeg`という名前のバイナリファイルだけ使う

### 2. Lambdaのコードを書く
適当にLambda用のディレクトリを作る。
そのディレクトリの中で、先程ダウンロードしたFFmpegのzipを解いて、中にある`ffmpeg`という名前のバイナリファイルを以下の改装に配置する。
お次にindex.jsにLambdaで実行したい処理を書く(以下)
*エラーハンドリングとかはしてないので、いい感じに改良して下さい。

“`
.
├── bin
│   └── ffmpeg
└──

元記事を表示

Lambdaでmiddleware実装 Go編

初めてのGoでなれないところも多く悪戦苦闘していますが、共通処理を外に出してメンテナンス性やコード可読性をあげたいと思い、middlewareを実装してみました。

## middleware用のコード

“`golang:middleware.go
package middleware

import (
“github.com/aws/aws-lambda-go/events”
)

type Handler func(events.APIGatewayProxyRequest) (interface{}, error)

func Middleware(next Handler) Handler {
return Handler(func(request events.APIGatewayProxyRequest) (interface{}, error) {
return next(request)
})
}
“`
handlerについての公式ドキュメントはこちら
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg

元記事を表示

DynamoDB Streamsのパラメータをいじって動作を確認する

# はじめに
DynamoDB Streamsは便利そうなのだけど、イマイチ正体が分からないので確認してみた。
Lambdaの仕組みをある程度理解していて、プログラムを書けることを前提とする。

# 参考
## 通知イベント
通知されるイベントの内容を調べてみようとしたら、クラスメソッド先生が既にちゃんと調べていた。
さすが。

【Developers.IO】[DynamoDB Streamで渡されるeventデータの表示タイプごとの内容をまとめてみた](https://dev.classmethod.jp/articles/dynamodb-stream-view-type/)

# 設定方法
設定方法は2種類。

DynamoDB側から設定する方法と、Lambda側でイベントソースを設定する方法。

前者は、以下のような感じで詳細な設定をすることができない。

![キャプチャ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/b8712b3b-d7d7-bb98-3734-c0e475a

元記事を表示

LambdaLayersをLambdaで作る

# はじめに

普段私が`Lambda`を利用する際は、`chalice`を利用して`Lambda`関数の作成とデプロイをしています。

`chalice`は便利なのですが、デプロイ時に毎回`pip install`して必要な`package`を集めているみたいです。
そのため、`pandas`などの重めの`package`を利用している場合は、デプロイに時間がかかります。

そこで、あらかじめ利用する`package`を登録しておく`Lambda`のサービスの`LambdaLayers`を活用します。

## 前提

`LambdaLayers`を作成する際の前提条件などです。

1. `LambdaLayers`は`packages`を`zip`で固めたファイルを利用して、あらかじめ`Lambda`が利用できる状態にすること[参考](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html)
1. `package`の配置などフォルダ構成も決まっている
1. `pandas`などの一部

元記事を表示

OTHERカテゴリの最新記事