Lambda関連のことを調べてみた2021年09月03日

Lambda関連のことを調べてみた2021年09月03日
目次

LambdaとSNSでTypetalkに通知する仕組みを作る

8月上旬に WAF Managed rule への変更が SNS トピック( aws-managed-waf-rule-notifications )に対して通知される機能がリリースされた。
今回は、 Lambda を使って Typetalk にそれを通知する仕組みを作ってみる。

#使用するサービス
##Amazon SNS
アプリケーション間のメッセージ、HTTP、Eメール、スマホのプッシュ通知を行うことができる。
ユーザーアクションをトリガーにできる。
今回は aws-managed-waf-rule-notifications という SNS トピックを使用し、 Lambda 関数に通知する。

##AWS Lambda
サーバレスでプラグラムを実行できるサービス。
今回は SNS からの通知を受け Typetalk api を叩く。

##Typetalk bot
Type talk 上のボット、 Typetalk api を叩くことで動かすことができる。

#システム構成
![Untitled.png](https://qiita-image-store.s3.ap-nor

元記事を表示

AmplifyでREST APIを構築したときに立ちはだかった4枚の壁(と小壁)

知っている方からすれば「どうしてそんなこと?」と思うようなことも、知らない時にはつまづいてしまうもの。現在地とゴールが違えば、また通る道が異なれば、ぶつかる壁も違うでしょう。
私の前に立ちはだかった壁のお話がどなたかのお役に立てば幸いです。何枚もの壁の先にゴールはありました。
「心臓を捧げよ」

# やろうとしたこと
まずは私の現在地とゴールです。
他の開発環境でREST APIを開発したことはあります。NoSQLもMongoDBを少々。今回はAmplifyを使って、REST APIを作ってみようと思います。
Amplify + RESTとすると、必然的に「Amplify + API Gateway + Lambda + DynamoDB」の組み合わせになることが分かりました。Lambdaは少し使ったことがありましたが、他は初めてです。

どんなものを作ろうか?
「トランプのカード52枚から何枚かのカードを選ぶ」というフロントがあり、そこで選んだカードの状態を「選ばれてない→選ばれた」に変えるAPIを作ってみようと思います。 :spades: :heart: :clubs: :diam

元記事を表示

LambdaのIPアドレスを固定化する

## はじめに

LambdaとAPIサーバを組み合わせたサービスを開発する際、Lambdaのアクセス制御をしたいケースがあるかと思います。
その際、IPアドレスでアクセス制御を行うことが多いと思うのですが、LambdaのIPアドレスは基本的には固定化されていません。
さらに、Lambdaが使うIPアドレス範囲も結構広く、ちょくちょく変わるため、IPアドレスを固定化しないと制御が難しい。

上記について、LambdaのIPアドレスを固定化させる方法を紹介します。

## 前提
VPC,Lambdaが作成されていること。
LambdaがVPCに紐づいていること。

## 手順
1. インターネットゲートウェイの作成
1. パブリックサブネットの作成
1. インターネットゲートウェイの割り当て
1. プライベートサブネットの作成
1. NATゲートウェイの作成
1. プライベートサブネットとNATゲートウェイを紐づける

最終的な構成としては、下記のようになります。
![LambdaToEC2.png](https://qiita-image-store.s3.ap-northeas

元記事を表示

Lambdaで値を返す方法まとめ

# 結論

handlerをasyncにして普通にreturnで99.9%くらいOK

## async + return

最も普通な方法です.

“`js
exports.handler = async (event) => {
const response = {
statusCode: 200,
body: JSON.stringify(‘Hello from Lambda!’),
};
return response;
};
“`

### async + returnでsetTimeoutする

“`js
exports.handler = async (event) => {
const response = {
statusCode: 200,
body: JSON.stringify(‘Hello from Lambda!’),
};

setTimeout(() => {
console.log(“1000ms後”);

元記事を表示

AWS日記30 (AWS Lambda – DLQ)

# はじめに
AWS Lambda 関数のデッドレターキューを試します。

非同期呼び出しが失敗した際に、メールを送信するように設定します。

今回は CloudFormation を利用して構築しました。
使用したテンプレートは[Github](https://github.com/tanaka-takurou/cloud-formation-templates/tree/master/dlq_for_lambda)に。

# AWS SAM テンプレート作成

AWS SAM テンプレートで Lambda, SNS の設定をします。

[参考資料]
[AWS SAM テンプレートを作成する](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorial-lambda-sam-template.html)

### Lambda関数とデッドレターキューの設定は以下の部分
“`yaml
Type: AWS::Serverless::Function
Properties:
F

元記事を表示

AWSのRDSのPostgreSQLでAWS Lambdaを呼ぶ

# 目的
PostgreSQLからAWS Lambdaが呼び出せるのでやってみます。
やり方は本家の[ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/PostgreSQL-Lambda.html#PostgreSQL-Lambda-invoke)の通りです。

# コード

## AWS Lambda
“`ruby:hander.rb
require ‘json’

def index(event:, context:)
{
statusCode: 200,
body: {
message: ‘Go Serverless v1.0! Your function executed successfully!’,
input: event
}.to_json
}
end
“`

## IAM
### IAM Policy
“`bash
aws iam create-policy –policy-name rds-lambda-policy

元記事を表示

AWS CodeCommitでPRマージ時にLambda実行

## はじめに
DevOps(CICD)の一環でCode CommitのPRがマージされた時にBuild・Deployを実行させるような仕組みを構築したのでその備忘録を残す

## 仕組み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/e1371743-42b5-acb0-c85e-f48853554ab9.png)

## Cloud Watch EventsのEventオブジェクトの中身
例えば、devブランチからmainブランチへのPRのマージを行うと以下のようなEventオブジェクトがLambda関数に渡る

“`json
{
“version”: “0”,
“id”: “c0931ce3-ee9f-d9f5-205c-a0ab8e3c0f9f”,
“detail-type”: “CodeCommit Pull Request State Change”,
“source”: “aws.codecommit”,
“account”: “xxx

元記事を表示

AWS lambdaを時間指定で1回だけ実行する方法

# はじめに
私はaws初心者です。lambdaで困ったことがあったからメモとして残します。

# やりたいこと
lambda functionを時間指定で1回だけ実行したい

想定しているケース
・ あるイベントがまとまったページを監視して、新しいイベントが登録されたらイベントが開催される1日前にLINEで通知する。

この場合だと、
Lambda①:スクレイピング→Lambda②の時間予約(新しいイベントの1日前)
(イベント情報も渡す)
Lambda②:関数①から受け取った情報をLINEに送信

# どうしたか
使ったもの:Lambda、EventBridge

> 補足
EventBridgeは**定期実行**とかをしてくれるらしい。この定期実行の規則をルールと呼ぶ。

“`python:Lambda①
import boto3

client = boto3.client(‘events’)

event_name = “ルールの名前”
description = “ルールの説明”
event_time = “cron(* * * * ? *)” #実行したい時間を満たす

元記事を表示

【Python / Gmail API / AWS Lambda】Gmailの未読メッセージを監視してSlackに通知する

![Untitled Diagram(22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/3a75999b-9547-83c5-e83f-9c4e8405cc6b.png)

## 背景

普段の業務において、どのコミュニケーションツールを使っているかは人それぞれだと思います。

私の場合、基本的はSlackがメインではあるのですが、そうは言ってもやはり一部においてGoogleのGmailなどに頼らざるを得ない事などがあります。(他社の人たちとのやりとり時などは特にそう)

ただ、頻度としてはそこまで高くはないため、必然的にSlackと比べてチェックの回数が少なくなり、レスポンスが大幅に遅れてしまうなんて事もしばしば…。

そこで、Googleが公開しているGmail APIを使って定期的に未読メッセージを取得し、Slackへ通知する事ができればその問題も解消できるかなと考えました。

## 完成イメージ

![スクリーンショット 2021-08-28 20.47.13_censor

元記事を表示

IAMユーザやLambdaからS3バケットにアクセスする方法

## はじめに
自分や他人のAWSアカウントが所有するS3バケットに対して、IAMユーザーやLambdaへのアクセス権限の付け方に少しハマったため、やり方を整理してメモとして残す。

## 今回整理した内容

1.**アカウントA**のS3バケットに、**アカウントA**で作成したIAMユーザがアクセスする方法(AWSコンソールを用いて)

2.**アカウントB**のS3バケットに、**アカウントA**で作成したIAMユーザがアクセスする方法(AWSコンソールを用いて)

3.**アカウントB**のS3バケットに、**アカウントA**のS3バケットにあるファイルを、Lambdaを実行してコピーする方法

4.**アカウントA**のS3バケットに、**アカウントA**で作成したIAMユーザがアクセスする方法(ローカルPCからAWS CLIを用いて)

※ここで言うアカウントは、AWSアカウントを指している。

## 1.**アカウントA**のS3バケットに、**アカウントA**で作成したIAMユーザがアクセスする方法(AWSコンソールから)

### ■事前準備

**アカウントAのS

元記事を表示

S3にオブジェクトをアップロードして引数をlambdaに送りたいとき

今まではS3をトリガーにLambdaを発火させていたのですが、これだと追加の変数を設定することができず、どうすればいいか悩んでいたときに、InvokeInputに渡せばいいことを知りました。

## 参考

https://qiita.com/yukpiz/items/269277a97053237a6980

## go server側

S3にアップロードしたあとに、invokeして変数を渡すようにしました。

“`main.go
package main

import (
“encoding/json”
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/lambda”
)

// これはLambda関数の完了で返すための構造体定義
type Response struct {
Message string `json:”message”`
Ok bool `json:”ok

元記事を表示

【AWS SAM】デプロイとローカル確認用のコンテナイメージを一つのDockerfileで使い分ける

# 初めに

LambdaアプリケーションをSAMで開発するにあたりコンテナでデプロイを初めて取り扱うにあたり色々試行していたのですが、
せっかくコンテナで環境をそのまま持ってけるんだからローカル環境も同じコンテナで処理したい!
でもDockerfileの多重管理はしたくない!となっていい方法がないかと模索していたところ
割と良さげな方法がありましたので備忘録がてらまとめます。

AWSのサポートに問い合わせてみたら記事執筆時点(2021/08/27)では
まだ公式のドキュメントが追いついてなく記載がなく追記予定らしいです。

こんなことしなくてももっと簡単にできるよっていうのがあったらご教示いただければと思います。

# 何がしたかったか

今回はAWS公式で提供されているpython3.8のイメージをベースとします。

大元のDockerfileはドキュメントに記載の通り以下で
`ENTRYPOINT [“/lambda-entrypoint.sh”]` が実装されており、これに対して
`CMD` で引数を渡すような作りをすることで対象のスクリプトを実行できます。
https://

元記事を表示

【Lambda】AWSのLambdaの設定項目について調べてみた。

#はじめに
先日、業務でAWSのLambdaというサービスを使うことになり、
それについて色々調べてみました。

今回は、備忘としてLambda関数の設定項目に関する説明を記述していこうかなと思います。

##Lambdaとは

Lambdaとはどういったサービスなのか。
AWSの公式ページには以下のように記載されていました。

>AWS Lambda はサーバーレスコンピューティングサービスで、サーバーのプロビジョニングや管理、ワークロード対応のクラスタースケーリングロジックの作成、イベント統合の維持、ランタイムの管理を行わずにコードを実行できます

わざわざサーバを構築せずとも。色々なことを実行できますよー的な感じですね。

Lambda上に実行したい処理(プログラム)を定義することにより、
指定したタイミングで実行することができます。

Lambdaを利用して様々なことができる訳ですが、
どんなことが出来るかは各自で調べていただけると幸いです。。

##Lambdaの設定

本題のLambdaで設定できる内容について記載していこうと思います。
なお、本記事では関数の設定項目につい

元記事を表示

Lambda関数内で、別AWSアカウントのLambda関数を呼び出す

**AWSアカウントA**内のLambda関数から**、AWSアカウントB**内にあるLambda関数を呼び出す方法の備忘録です。

もともとのゴールは、アカウントA内のAmazon **Lexボット**から、アカウントB内のLambda関数を直接呼び出すことでした。

しかし現状無理そうなので、アカウントA内の(プロキシ)Lambda関数を経由して、間接的にアカウントBの(本命)Lambda関数を呼び出すことにしました。

##概要

Lexボットがある、**呼び出し側**のAWSアカウントを**アカウントA(ID:999999999999)**、**呼び出される**本命Lambda関数がある側のAWSアカウントを**アカウントB(ID:000000000000)**とします。

アカウントA内に作成するプロキシLambda関数が、アカウントB内の本命Lambda関数を呼び出すには、アカウントBの側で**アカウントAのアクセスを許可**する必要があります。

セットアップ全体の流れは次のとおり。

1. アカウントB内に、本命Lambdaの実行権限を持つIAM Roleを作成

元記事を表示

Terraform+SAMでLambda+APIGatewayの環境構築

## どういう記事か

terraform, samの初心者がapi gateway + lambda + cloudfrontの環境構築をしたときのメモです。

## 前提

– m1 mac
– macos big sur

## 参考

https://dev.classmethod.jp/articles/sam-and-terraform-example/

## terraformのダウンロード&インストール

tfenvから導入を始めます。
tfenvが正しい方法なのかはよくわかっていませんが、、

“`
brew install tfenv
“`

今回は `0.15.5`をインストールしてみました。

“`
tfenv install 1.0.5

Installation of terraform v1.0.5 successful. To make this your default version, run ‘tfenv use 1.0.5’
“`

これで設定します。

“`
$ tfenv use 1.0.5

$ terraform –vers

元記事を表示

【実践!AWS Lambda】Javaで書いたLambdaの初回起動が遅い問題を解決する

# ■ 概要
AWS Lambdaの開発において、必ず出てくる初回起動が遅い問題、、、
NodejsやPythonなどのスクリプト言語のLambdaであれば対策は比較的簡単なのですが、Javaなどのコンパイル型の言語の場合は難易度が上がります
JavaのLambdaの初回起動にかかる時間を**8秒→1秒**に短縮することに成功したので、ここに備忘録を残します

# ■ 目次
1. 前提条件
1. 設計要素の洗い出し
2. コールドスタート対策
2. DBコネクション対策
2. クラスローディング対策

# ■ 前提条件
・ランタイムはJava 11を使用
・以下のような構成とする
①API GatewayをトリガーにLambdaが起動
②RDS Proxyを介してAuroraに接続
③ClientにResponceを返す
![構成図-ページ2のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/6e762b10-849d-1e3e-7b23-044ed2c92e3d.png)

元記事を表示

Django + SQLiteをLambda + APIGatewayで動かす

# はじめに
以前、DjangoをLambdaで動かしたいと思ったのですがうまくいかず、諦める予定で下記の記事を書きました。

https://qiita.com/kerorinfather/items/4f9e6c9295ab3886e1f4

しかし、なんか悔しかったので動かしてやろうと思い、(無理やり?)動かすことができましたので記事にまとめました。もしよろしければ、上記の記事も見ていただけると嬉しいです。

# 目指す仕様
できるだけ維持費が安く済むシステムを目指すため、下記の要件を満たすこととします。

– Apacheなどは使わず、APIGateway + Lambdaで動かす
– データベースはSQLiteを使用

Djangoを解説しているサイト等を見ているとSQLiteは使うなというような記事を見かけるのですが、今回はプロトタイプを安く維持することを目標とするのでSQLiteを使います。

# 問題点と解決方法
さて、上記の条件でシステムを動かす上で、上記記事中でも挙げているのですが以下の問題があります。

## 問題点(1):Lambdaで動かすSQLiteのバージ

元記事を表示

【React / Laravel / AWS Lambda】ポートフォリオ (カンバン方式のタスク管理アプリ) を作成しました。

主にスキル向上を目的に、ポートフォリオとしてタスク管理アプリ (**Miwataru**) を作成しました。

これはシングルページアプリケーション (SPA) になっており、フロントエンドには、**TypeScript / React**、バックエンドには、**PHP / Laravel**、インフラには、**Vercel** (静的サイト) / **AWS Lambda** (API) を使用しています。詳細は後述の[開発環境 (フロントエンド)](#開発環境-フロントエンド)、[開発環境 (バックエンド)](#開発環境-バックエンド)、[本番環境](#本番環境)をご覧ください。

アプリケーションや作成したコード、実装過程の説明については、以下のリンクからアクセスできます。

– アプリケーション: [https://www.miwataru.com/](https://www.miwataru.com/)
– GitHub: [https://github.com/zuka-e/laravel-react-task-spa](https://github.com/z

元記事を表示

CloudWatchLogs のログ検索を行う場合適切な絞り込みを行わなければ非常に効率が悪いという話

# この記事について
Lambda API でエラーが発生したときに、CloudWatchLogs にいったんエラーを集積して、cron で動く他の Lambda で定期的にエラーを集計してその件数を slack へ通知していた。

これが突如一切のエラーを報告しなくなった。
その訳と取った対策についての記事。

時間がない場合経緯の箇条書き部分と結論だけ読めばよい。

***

# 問題のコード
エラー発生時に slack 通知用のエラー内容を専用のロググループに書き込んでおくことで定期的に slack に通知する。

Lambda API は ruby で作っているが、通知用の Lambda は Node.js で作ってあるというちぐはぐ具合だが気にしない。

## ログ書き込み部分

Lambda API でエラーが発生したときに `send_api_error_event` に exeption を渡して実行すると指定のロググループにログを書き込む。

一応、ある程度汎用的にするために同一日付・同一インスタンス使用中は同じログストリームに書き込むことを期待したコードにしているが

元記事を表示

CloudFrontとLambda@Edgeを用いて、パスに応じて画面の表示を変える

#はじめに
題名通り、例えば、リクエストのパス配下に`error`が含まれている場合と`success`が含まれている場合で、画面表示を変える方法についてまとめました。

`https://test.com/hoge/error`をリクエスト → エラー画面を表示
`https://test.com/hoge/success`をリクエスト → 成功画面を表示

#事前準備
・CloudFrontを作成

#流れ
①Lambda@Edge作成
②コード記入
③Lambda@Edgeデプロイ

#①Lambda@Edge作成
・リージョンは`バージニア北部`
・1から作成
・関数名:適当に記入
・ランタイム:Node.js
・デフォルトの実行ロールの変更:AWS ポリシーテンプレートから新しいロールを作成を選択
  →ポリシーテンプレート:基本的な Lambda@Edge のアクセス権限

・関数の作成をクリック

#②コード作成

“`js:node.js
const success_content = `


元記事を表示

OTHERカテゴリの最新記事