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

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

PyCharmのPYTHONPATHが上書きされてしまう

docker-compose環境をinterpreterに設定しています。
interpreterの設定で環境変数に `PYTHONPATH=/library_path` を指定しています。
PyCharmのGUIからunittestをrunするとPYTHONPATHで設定したパスのライブラリを見つけることができません、どうやらPYTHONPATHが上書きされている様子。

回避方法は2つある。
* site-packagesにもライブラリ入れておく→ちょっと2重管理になって気持ち悪い
* GUIでの実行を諦めてコマンドラインにてテスト実行→今回はこれを採用

lambda layerにpipライブラリ群を入れているためこのような状況になってます。
lambda layer便利だけど、このあたりのlambdaの実行環境とローカルの開発環境を差を吸収する部分でちょっと工夫が必要。
あまりスッキリした解決方法ではないのも悩ましい。

元記事を表示

DynamoDB StreamsのイベントをフィルタリングしてLambdaを実行する(おまけ付き)

# はじめに
 Lambdaでは、DynamoDB Streamsでデータの変更を検知して実行することができます。以前は、変更のたびに毎回Lambdaが実行され、Lambdaのコード内で追加、更新、削除を判断して処理を行う必要がありました。この方法では、毎回Lambdaが実行されるため、その分、費用がかかる状態でした。
 それが2021年11月のアップデートでLambda実行前に処理を実行するかどうかフィルタリングすることができるようになり、コードの簡略化や不要な実行がなくなり費用も低減できます。
 今回は、実際にフィルタリングを設定し、実行してみます。

# 事前準備
 トリガーとなるDynamoDBのテーブルを作成し、ストリームを有効化しておきます。その後、ストリームARNをコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/8da1e5c4-7959-3a56-75b4-defebfb66c2a.png)

![image.png](https://

元記事を表示

Lambda Layersを使って処理をまとめてみた

## 背景
アカウントAの複数のLambdaから別のアカウントのEC2の情報を取得する実装を行っていて、Lambdaの中がほぼ同じ処理なのでLambda Layersを使ってmodule化してみます
![スクリーンショット 2022-03-22 13.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/6dd8867f-882c-3f10-3d3d-0310dcb6e3df.png)

## 今回話すこと
– Lambda Layersの概要
– Lambda Layersの使い方

## 今回話さないこと
– クロスアカウントロール周り
– Lambdaのコードの解説
– Lambda関数の作成方法

## Lambda Layersの概要
公式には下記のような説明があります
>Lambda レイヤーは、追加のコードやデータを含めることができる .zip ファイルアーカイブです。

簡潔に言うと1つの関数を定義してそれを複数のLambda関数で使うことができるということです。!

元記事を表示

AWS Chalice で AWS Data Wrangler を利用する

# はじめに
AWS 上のデータを Pandas[^pandas] で処理したいときには、各種 AWS サービス(RDS, DynamoDB, Athena, S3 など)からのデータの load/unload を簡単化してくれる Python モジュール AWS Data Wrangler[^awswrangler] が超便利です。しかも、AWS 自体が開発してオープンソース公開しているものなので、ある程度安心して使えます。
なんですが、この AWS Data Wrangler を Lambda で利用する際には、デプロイパッケージのサイズに適用されるクォータ(未圧縮で 250MB、zip 圧縮済みで 50MB)が問題になります。具体的には、AWS Data Wrangler を普通に pip でインストールすると、それだけでパッケージサイズが 250MB を超えてしまいデプロイすることができません。
実はこの問題、[AWS Data Wrangler のドキュメント](https://aws-data-wrangler.readthedocs.io/en/2.14.0/instal

元記事を表示

APIgatewayのプロキシ統合と非プロキシ統合についてわかってなかった

・勘違いポイント
プロキシ統合、非プロキシ統合、なにもしないの3択だと思ってた
・実際
APIgateway(少なくともRESTAPI)は統合をする必要がある
→統合方法としてプロキシ統合をするかプロキシを使わないか(非プロキシ統合か)を選ぶという考え方だった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/705ee572-f71a-28b4-7d16-14d7b223c79a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/a60f295f-44f4-5564-6881-26fd0404c6a7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/36713737-1105-c5a1-1456-7e176d243fe9.png)

元記事を表示

Python リスト内包表記とmap,lambda攻略(基礎)

# リスト内包表記はよく見かけるので、仕組みを理解しよう(ついでにmapやlambdaも)

## 目次
01. [リスト内包表記](#listin)
02. [リスト内包表記_if文](#listin_if)
03. [lambdaやmap](#lambda)


### 今回使用するテストデータは以下とします

“`python
TestList = [1,2,3,4,5]
“`


## 01.リスト内包表記

リスト内の要素に対して演算(2倍)をします

“`python
processed_list = [num*2 for num in TestList]
“`

この結果は以下になります
“`
[2,4,6,8,10]
“`

あえて、言葉で書くならこんな感じでしょうか。

![スクリーンショット 2022-03-21 21.03.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/f0a169fb-903

元記事を表示

Challiceを使用し、Lambdaのコードを管理 ②

# はじめに
LambdaをGithubでコード管理するにあたり、chaliceを採用したため、chaliceについてまとめます。
前回の続きになります。

https://qiita.com/holdout0521/items/e6c8b12dab5728d36684

# config.jsonの設定
config.jsonは、以下の2つがわかりやすいです。

https://aws.github.io/chalice/topics/configfile.html

https://www.nooozui.com/entry/2019/10/31/223506

## VPC内でLambdaをデプロイ
VPC内でLambdaを使用する方法を説明します。

`subnet_ids`と`security_group_ids`の2つを設定するだけです。

`subnet_ids`:VPCに配置してあるサブネットのうちどのサブネットを使用するか指定する。
`security_group_ids`:lambdaに設定するセキュリティーグループを指定する

“`diff_json:confi

元記事を表示

LambdaでIAMロールを付与していないとこんなエラーが出る件

## 経緯
EventBridgeをキックしてLambdaでEC2を停止するスケジューリングを立てようとしたところ、Lambda実行で権限のないエラーが発生したので、調査した結果を記事にしてみようと思った。

## 構成
![stop_ec2_at_lambda.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/cc627c27-6fc6-b0c0-8084-13c3e6ea35cf.jpeg)

## Lambdaのコード
言語は「Python3.9」です。

“`
import boto3

region = ‘ap-northeast-1’

instances = [‘i-0cfa865823946e45e’]

def lambda_handler(event, context):
ec2 = boto3.client(‘ec2’, region_name=region)
ec2.stop_instances(InstanceIds=instances)
“`

元記事を表示

Lambdaレイヤーを作成・アップロードする

# はじめに

機械学習APIを作りたいとき、なるべくサーバの保守をしないで済むようにしたい場合、あまり高機能なものをやるわけではなければAWSのLambdaでサーバレスなシステムを作ることによって安価・迅速に実現したくなることがあると思います。

その場合、詰まるところがいくつかあったのでまとめてみました。

すぐにLambdaにLayerをアップロードしたいという方はGithubにコードをあげておいたのでこちらをご確認ください。

https://github.com/mynkit/upload-lambda-layer

# Lambda-Layers

Lambdaは機械学習関連のパッケージはおろか、numpyやpandasも標準でインストールされていません。そのため、必要なライブラリのコードを[Lambda-Layers](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer)にアップロードする必要があります。

元記事を表示

AWSサーバーレス仕組みでメールの自動送信システムの構築

こんにちは、王と申します。

うちの会社は改善の取り組みを実施しており、ヒヤリハットの事例を皆さんに入力頂くように
自動的にメールで案内を出すシステムを構築することを検討しています。

社員名簿をもらい、毎月、月と氏名コードの下1桁が一致する方を対象にメールを発信する
という要件だそうです。
AWSのサーバーレスのクエリサービスを利用することで、オンプレミス環境でDBサーバーを立てるより、
手間を省くと思うのでメールの自動送信システムを構築することにしました。

私の設計した構成図は以下の通りです。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/046df616-05e3-c59d-bab8-491c49404aee.png)
1)「社員名簿.xlsx」をCSVファイルに変換し、S3 Bucketへアップロードする
2)Athenaで、DDLを作成・実行し、社員名簿テーブルを作成する
3)Athena APIを呼び出し、通知するメールアドレスを抽出するLambda関数を作

元記事を表示

Challiceを使用し、Lambdaのコードを管理 ①

# はじめに
LambdaをGithubでコード管理するにあたり、chaliceを採用したため、chaliceについてまとめます。

chaliceのメリットとして、以下が挙げられます。
– シンプルにLambdaをコード管理できる
– デプロイがSAMに比べて、簡易でデプロイが早い
– 今回は、Lambdaのみですが、API Gateway、S3, SNS, SQSといったAWSサービスも利用できる
– IAM ポリシーを自動生成してくれる

今回は、APIGatewayは、使用せず、複数のLambdaのコード管理をするために、Chaliceを使用します。

# IAMユーザーの設定
ローカルのmacのターミナルで`chalice`をインストールします。

“`terminal
$ python -V
Python 2.7.18

$ pip install chalice

$ chalice –version
chalice 1.26.0, python 3.9.2, darwin 21.3.0
“`

ChaliceでLambdaをアップするためには、アップするAWSア

元記事を表示

標準ライブラリurllib request と 外部モジュールrequests をLambdaのコードでそれぞれまとめた

# はじめに
Lambdaでapiにリクエストする際、requestのモジュールが必要でした。
標準ライブラリurllib request と 外部モジュールrequests がありましたので、それぞれまとめます。

外部モジュールであるrequestsの方が、コード量が少ないですが、モジュールをアップする手間があります。
ただ、手間と言ってもchalice等を使用することで、手間を無くすことはできます。

# 標準ライブラリurllib request
requestsライブラリをデプロイパッケージに含める必要はなく、`import request`するだけでよいです。

https://docs.python.org/ja/3/library/urllib.request.html

## GET,POSTの場合

“`py
from urllib import request
import urllib
import json
import os

# get
def get_api(event):

api = ‘/test’
request_url = os

元記事を表示

【ServerlessFramework】serverless.ymlで利用できる変数のまとめ

serverless.ymlの変数の仕様がどこにまとまっているかわからず、かなり探し回ったのでまとめておこうと思いました。
内容的には公式ドキュメントからよく使いそうなものを抜粋しただけです。

https://www.serverless.com/framework/docs/providers/aws/guide/variables

# 基本的な変数の利用方法
まずはじめに、変数の参照には `${}` を利用します。
“`serverless.yml
yamlKeyXYZ: ${variableSource}
“`

ちなみに、serverlessの変数は再帰的な参照がサポートされており、変数をネストすることができます。

“`provider
provider:
name: aws
environment:
MY_SECRET: ${file(./config.${opt:stage, ‘dev’}.json):CREDS}
“`

# デフォルト値
参照先の変数が存在しない場合にデフォルト値を利用したい場合は `${variableSource, d

元記事を表示

銀河麻雀の待ちを判定するWebアプリを作った

麻雀YouTuberの麻雀カッコイイシリーズが投稿した「銀河麻雀」。

(ルール説明は13:40くらいから)
簡単に言えば、各種類の牌に1枚ずつ「ギャラクシー牌(銀河牌)」と呼ばれる牌種が自由になる牌が入った状態での麻雀だ。
例えば、銀河1mは1p,1sとしても扱える。
銀河東は東南西北、銀河白は發中としても扱える。

銀河牌がたくさん入ると、受け入れや待ちの数が通常よりも多くなる。
銀河牌が沢山入った順子が並べば、とても人間の頭では処理しきれない、まさに銀河が広がるような麻

元記事を表示

AWS LambdaでBoxSDK(JWT認証)を使おうとしてハマった件(備忘録)

# はじめに
本記事はタイトルの通りです。

とてもハマったため、備忘録として残しておこうと思ったのと同じようにハマって
しまった方の参考になればと思います。

結果的にAWS Lambda上でBoxSDKを使ったAPIは動作しました。
先にどうやって動いたかを紹介したあと、ハマった経緯や原因などの解説にはいります。

# Lambda環境(BoxSDK動作確認済み)

こちらの記事を参考にBoxSDKをインストール、ZIP化、S3への格納、Lambdaへのレイヤー追加を行います。cryptographyのレイヤー追加、記事ですがBoxSDKもかなり関わってました。

レイヤー追加時ですが、互換性のあるランタイムにpython3.7/3.8/3.9を指定
互換性のあるアーキテクチャはx86_64を指定しました。

https://qiita.com/Bacchus/items/7dcfc0237df196d1ab67

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/e7e5

元記事を表示

AWS lambdaでログが重複して出力される理由と対処法(Python)

# はじめに
AWS lambda上で、Pythonのloggingモジュールを使い、ログを表示させていたところ、重複してログが表示されていることに気づいたので、重複してログが出力される理由とその対処法を調査した。

# ログが重複する理由

### lambdaのlogging仕様
lambda上では、デフォルトで、ルートロガーにLambdaLoggerHandlerというハンドラが登録されている。([参照記事](https://qiita.com/k_hoso/items/ba7614775dbec089d18d))
つまり、自分で新たなハンドラを登録すると、ハンドラが複数存在することになり、ログが重複して出力されてしまう。

#### コード

“`python: デフォルトで存在するハンドラの確認

from logging import getLogger, StreamHandler, DEBUG, Formatter

def lambda_handler(event, context):
logger = getLogger()
logger.setL

元記事を表示

AWS Chalice Tips

## 公式ドキュメント
[Documentation — AWS Chalice](https://aws.github.io/chalice/index.html)

### 環境

– Python: 3.8
– Chalice: 1.26.6

## Chaliceでapp.pyの分割

chaliceでは`app.py`にエンドポイントを設定していくため、一つのプロジェクトで複数の管理をやらせようとすると肥大する傾向がある。

例:
“` python:app.py
from chalice import Chalice
app = Chalice(app_name=’foo-app’)

@app.route(‘/’)
def index():
return {‘hello’: ‘world’}

################
# 記事管理
################
@app.route(‘/articles’, methods=[‘GET’])
def getArticles():
# ~
# Something Code
#

元記事を表示

make(旧integromat)を使ってLambdaを実行する

## 1.はじめに
make(旧integromat, 以下本記事ではmakeで記します)からLambdaを呼び出す手順です。
ただそれだけなのですが、makeに関する情報が少なく難儀したので、やったことを書き留めました。

## 2.今回やること
こんな感じのパイプラインを作ってLambdaを実行します。
Slackのチャンネルに投げたメッセージをトリガーにして、OutgoingWebhooksからmakeのWebhooksを呼び出す。
WebhooksはSlackやGmailに代替しても同じことができると思います。

![スクリーンショット 2022-03-14 21.25.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278897/4f82290b-f3e2-c090-332e-6b27ad24e777.png)

## 3.アプリの設定
一般的な手順で各アプリに対して設定を行い、パイプラインを作ります。

### 3-1.Slack
適当なチャンネルを作成する。パブリックとプライベートど

元記事を表示

lambdaでセキュリティグループのインバウンドルールを変更する

AWSに構築したシステムのセキュリティ設計として、セキュリティグループでインバウンド制限をすることは珍しくないと思います。システムの利用者が増えた・減った場合、セキュリティグループを更新する必要があり、通常はAWSコンソールで変更すれば良いですが、諸事情により非エンジニアがAWSコンソールを使わずに変更できるようにする必要があったので、その方法をメモしておきます。

# はじめに
設定する人がエンジニアではない想定だったので、WEBでセキュリティグループのインバウンドを追加・削除できるようにしました。全体のアーキテクチャは下記のような感じなのですが、この記事ではlambdaにフォーカスしています。

![provDiagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989777/4c9dff3d-0b12-3990-03e8-3c8ee5cfe207.jpeg)

# lambdaでセキュリティグループの追加削除する
lambdaでboto3を使ってセキュリティグループへのIPアドレス追加、削

元記事を表示

Amazon Connectで、オペレーターが着信履歴からユーザー情報を確認する方法

# はじめに
電話をかけると、オペレーターに繋げるConnectシステム構築した際、オペレーターが電話に出られず、発信者が電話を切る場合があります。
その場合、オペレーターが折り返しの電話をする必要があり、かつ発信者の名前を知る必要がありました。

Connectのシステムは、事前に電話番号と名前をDynamoDBに登録したユーザーのみが使用できる仕様です。
そのため、`オペレーターが着信履歴からユーザー名などを確認できる仕組みを構築`しましたので、まとめます。

# 事前構築
下記のサービス構築を行いました。
DynamoDBでは、パーティションキーを`電話番号(user_phone)`にし、`family_name`と`given_name`を属性として加えます。
connectに発信すると、発信電話番号をLambdaが受け取り、Lambdaが発信電話番号から`電話番号(user_phone)`に一致する項目を取得し、`family_name`と`given_name`を返すようにします。

その後、オペレータにつなげる、というお問い合わせフローを作成します。
![スクリーンショッ

元記事を表示

OTHERカテゴリの最新記事