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

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

Lambda layersでAWS SDKを使用できるようにする

#ゴール
Lambda上でNode.jsのライブラリ(今回はaws-sdk)を使用できるようにする

#前提
・LambdaのランタイムはNode.js 14.x
・OSはWindows(10 Pro)

#やることたち
①node_modulesのライブラリをDL
②ZipしてLambda layersに登録

#①node_modulesのライブラリをDL
・コマンドプロンプトを開く

・「nodejs」という名前のディレクトリを作成

“`
mkdir nodejs
“`

・ディレクトリ「nodejs」を選択する

“`
cd nodejs
“`

・npm(Node Package Manager)を初期化する(設定情報の入力を求められるがすべてEnterでスキップしてもよい)

“`
npm init
“`

・aws-sdkをインストールする(Node.jsにてほかのライブラリを使用する場合は一緒にインストールしておきましょう)

“`
npm install aws-sdk
“`

#②ZipしてLambda layersに登録
・①でaws-sdkをイ

元記事を表示

Lambdaから同一アカウント内のEC2インスタンス情報を取得する

#ゴール
1つのAWSアカウント内にあるEC2インスタンスの情報を取得する

#前提
・EC2にインスタンスが1つ以上存在する
・LambdaのランタイムはNode.js 14.x
・OSはWindows(10 Pro)

#やることたち
①Lambda関数を作成する
②Lambdaのレイヤーを作成
③Lambda関数に割り当てたロールの権限を設定する
④コードを書き、実行する

#①Lambda関数を作成する
・コンソール画面からLambdaの画面を開き、「関数の作成」を押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/459bc224-4639-5fca-6758-4aab8ce196d6.png)

・「一から作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/533cb7e8-cbdd-999a-8224-87da3f3469f1.png)

元記事を表示

LambdaでGlueジョブの実行履歴をひたすら表示する

# 背景・目的
– GlueAPIのget_job_runsは、デフォルト100件(最大200件)しか返さないので、それ以上の結果を知りたい場合は、何度も実行する必要があったのでプログラム化しました。

# 結論
– NextTokenを使う。

# 内容
## APIリクエスト
– NextTokenがある場合と、それ以外で分ける必要がある。

### 初回もしくは、NextTokenがない場合
“`
response = glue_client.get_job_runs(JobName=job_name)
“`
### NextTokenがある場合
“`
glue_client.get_job_runs(JobName=job_name, NextToken=next_token)
“`

## コード全体

“`
import json
import boto3
import time
import os
import logging
import subprocess

logger = logging.getLogger()
logger.setLevel(logg

元記事を表示

最寄りのバス停にバスがあと何分で着くかだけを表示するミニサイネージ(M5Stack、UIFlow)

# はじめに
最寄りのバス停にバスがあと何分で着くかだけを表示するミニサイネージを作りました

元記事を表示

Lambdaからツイートしたい(Twitter API V2対応)

Lambdaを使って、今日の天気を定期ツイートするためにTwitterAPIを使うことにしました。
しかし、TwitterAPIが1ヶ月ほど前にバージョンアップしており、ネット上のソースコードをコピペしても上手くいきませんでした・・
数少ない情報を元になんとかツイートまでいけたのでメモ!

# 環境
**デプロイ環境**
AWS Lambda
Python 3.9
**ローカル環境**
MAC
Python 3.9.6

# 開発準備
以下の順序で進めます。
①Twitter APIアカウント登録
②Twitter API認証設定
③python3インストール
④tweepyインストール

## Twitter APIアカウント登録
まず、PCで自分のTwitterアカウントにログインしときます。
**(注)電話番号の登録をしていない場合は必ずしてください!**
その後、[Twitter Developerサイト](https://developer.twitter.com/)で利用登録します。
![image.png](https://qiita-image-store.s3.ap-

元記事を表示

Lambda+Pythonでマルチプロセス化による高速化検証(キューイング処理を自前で作る)

Lambdaの処理を高速化しようと思ったのでマルチプロセス化を試した結果を残しておきます。
pythonのmultiprocessingを使う場合、[LambdaではPool/Queueが使えないという問題](https://aws.amazon.com/jp/blogs/compute/parallel-processing-in-python-with-aws-lambda/#:~:text=Python-,Parallel%20Execution,-The%20multiprocessing%20module)を回避しているので、困っている方の参考になればと思います。

# 前提

高速化対象の処理はブロッキングが発生する処理
⇒asyncio等でマルチスレッディングしても効果がない処理
⇒検証ではシンプルに1000万回ループして変数にインデックスをセットするだけという処理を10回実行

# 比較結果一覧

Lambdaはメモリに応じてvCPUの数が増減し、メモリ10GBで6つまで拡張可能となっているため、各メモリに応じた実行時間を比較してみたいと思います。

https://a

元記事を表示

青いベンチ診断の結果をひたすらtwitterに投稿するアカウントをつくった

[Zenn](https://zenn.dev/okaponta/articles/d89b8c99458b22)にも投稿したので、好きな方でお読みいただければと思います。

# はじめに
みなさま「青いベンチ」という曲はご存知でしょうか。
「この声が枯れるくらいに 君を好きと言えばよかった」からはじまるサビは聞いてて心地いいですね。

さて、私がこの曲を知ったのは[青いベンチ診断](https://shindanmaker.com/240064)というものです。
これがまた面白くて、1/157464の確率で「青いベンチ/サスケ」という文字列が揃うものになります。
確率からしてだいたい外れるんですが、以下のような診断結果が出力されてクスってきてしまいます。

揃わなかった文字列を言い合うみたいなtogetterもありました。

https://togetter.com/li/452165

2021年の終わりになぜか「ひたすらこの診断結果を投稿するBotを作りたい」と強く

元記事を表示

AWS ChaliceからLambda Powertoolsを使ってみた

# 1.はじめに
みなさんLambda Powertoolsはご存知でしょうか?Lambda関数用のライブラリで、X-Rayによるトレース、ログ出力、CloudWatchのカスタムメトリクスの作成等々が簡単に実装できる優れモノです。
現在対応している言語はPython、Javaの2つですが、今回はPython向けのサーバレスフレームワークであるChaliceの中でLambda Powertoolsを使う方法を紹介していきたいと思います。
Chalice&Lambda Powertoolsって何やねんという方は、記事の末尾に参考のリンクを貼ってますので興味があればご覧ください。

# 2.ChaliceからLambda Powertoolsを使う方法
以下、ライブラリのインストールも含め手順を書いていきたいと思います。

## 2-1.ライブラリのインストール
まずは事前準備として開発環境にChalice、Lambda Powertoolsをインストールします。
シンプルにpipでインストールできます。

“`
$ pip install chalice
$ pip install

元記事を表示

SAMとGoのテンプレートエンジンでSSR

静的なテンプレートを読み込んでSSRを行うWebアプリケーションを作成します。

## 前提知識

* AWS SAM と Golang を利用して Severless なWebアプリケーションを作成することができる。
* Golang の html/template パッケージを利用してHTML形式の文字列を標準出力することができる。

(以後AWSとlangは省略して記述します)

## Lambdaで静的なファイルを扱う

様々な方法があるかもしれませんが、今回は `AWS Lambda Layer`[^1] を利用します。
この機能を利用することで、 HTMLやCSS等の静的なデータをLambdaのzipファイルに含めることができます。

SAMでは、SAMのテンプレートファイル内に設定を記述することでLambda Layerを構築することができます[^2]。

## 構築

早速SAMでLambda Layerを利用したアプリケーションを構築してみましょう。
今回は以下のような単純なページを作成していきます。

PythonでのLambda環境変数の取得

#前提

###環境変数の設定

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html

環境変数は、関数の未公開バージョンで定義します。バージョンを公開するとき、他のバージョン固有の設定とともに、そのバージョンの環境変数がロックされます。
関数の環境変数を作成するには、キーと値を定義します。関数は、キーの名前を使用して、環境変数の値を取得します。
**Lambda コンソールで環境変数を設定するには**
1.Lambda コンソールで [Functions (関数)] ページを開きます。
2.関数を選択します。
3.**[Configuration]** (設定) を選択してから、**[Environment variables]** (環境変数) を選択します。
4.**[環境変数]** で、**[編集]** を選択します。
5.**[環境変数の追加]** を選択します
6.キーと値を入力します。
    **Requirements**
&

元記事を表示

Pythonでの Lambda関数共通ユーザ(cognito)操作Util

#実装
“`user_utils.py
# -*- coding: utf-8 -*-
import secrets
import string
import boto3

USERPOOL_ID = ‘USERPOOL_ID’
client = boto3.client(‘cognito-idp’)

def show_user_list():
“””Cognitoおよびエンティティからユーザリストを取得する(最大60名)
Returns:
ユーザ情報(ユーザーID、ユーザー名、状態、グループ権限)
“””
def _user_list(pagination_token=None):
“”” Cognitoユーザーリストの再帰取得
Args:
pagination_token: 前回呼び出しトークン

Returns:
ユーザ情報(ユーザーID、ユーザー名、状態、グループ権限)
“””
if paginati

元記事を表示

Pythonでの Lambda関数共通StepFunctionUtil

#実装
“`step_functions_utils.py
# -*- coding: utf-8 -*-
import boto3

stepfunctions_client = boto3.client(‘stepfunctions’)

def execute(state_machine_arn, input_message_body):
“””StepFunctionsを呼び出す関数
Args:
state_machine_arn: 呼び出したいStepFunctionsの名前
input_message_body: StepFunctionsを呼び出す際のメッセージ
Returns:
start_execution実行結果(dict)
“””
try:
return stepfunctions_client.start_execution(
stateMachineArn=state_machine_arn,
input=

元記事を表示

pythonでの Lambda関数 キュー送信

#実装
“`sqs_utils.py
# -*- coding: utf-8 -*-
import boto3

sqs_client = boto3.client(‘sqs’)

def push_message(message_body):
“””SQSの特定キューにメッセージをPUSHする
Args:
message_body: PUSHするメッセージ
Returns:
sqsメッセージ送信時のレスポンス
“””
try:
response = sqs_client.send_message(
QueueUrl=”https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXXXX/my-sqs”,
MessageBody=message_body
)
except Exception:
raise
return response

“`

#参考
htt

元記事を表示

Pythonでの Lambda関数共通ログ出力Util

#実装

“`log_utils.py
# -*- coding: utf-8 -*-
import logging
import sys
from datetime import datetime
from pytz import timezone

def _customTime(*args):
“””ログ用の時間出力
Returns:
現在時間(Asia/Tokyo)
“””
return datetime.now(timezone(‘Asia/Tokyo’)).timetuple()

LOG_LEVEL = ‘INFO’
_logger = logging.getLogger(__name__)
_logger.setLevel(LOG_LEVEL)
_logger.propagate = False
for h in _logger.handlers:
_logger.removeHandler(h)

h = logging.StreamHandler(sys.stdout)
# ロガーのフォーマット指定
FO

元記事を表示

Pythonでの Lambda関数共通認証Util

#実装

“`auth_utils.py
# -*- coding: utf-8 -*-
import base64
import boto3
import json

cognito_client = boto3.client(‘cognito-idp’)
cognito_identity_client = boto3.client(‘cognito-identity’)
USERPOOL_ID = ‘USERPOOL_ID’
CLIENT_ID = ‘CLIENT_ID’
IDENTITYPOOL_ID = ‘IDENTITYPOOL_ID’

def authenticate(user_id, password):
“””指定されたユーザIDとパスワードで認証を実施する
Args:
user_id: ユーザID
password: パスワード
Returns:
認証結果(AccessToken,RefreshToken,IdToken,ExpiresIn,TokenType)
“””
tr

元記事を表示

Pythonでの Lambda関数共通レスポンスUtil

#目的
PythonでのLambda関数共通レスポンスUtilを作成方法を共有します。

#実装
“`response.py
import decimal
import json

class DecimalEncoder(json.JSONEncoder):
“””DecimalEncoder クラス
Decimal クラスを使用して保存された数値を出力するために使用されます(Amazon DynamoDBの数値を保持します)
“””
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)

def response_200(body, **kargs):

元記事を表示

外部ライブラリのLambda Layerを生成するAPIをLambdaで作ってみた【Python】

もはやクリスマスが終わってしまいましたが、Advent Calendarの24日目です。
直前に書き始めた+文量があるので、読みにくい箇所があったらすいません!(何部作かに分けるべきだったか、、)

## 0. はじめに
この記事では、「Lambdaで確実に動くコンパイル済みライブラリが欲しいなら、Lambda自身に作らせてしまえばいいのでは?」というアイデアから始まり、AWS LambdaとAPI Gateway、S3を使ってLambda Layer用のPythonライブラリをLambda自身が生成してくれるAPIを作って素晴らしく快適なLambda生活が送れるようになったライフハック(?)を紹介します。

– M1 Macなどarm64アーキテクチャの上のDockerではx86_64用のLayerが作れない(逆も然り)
– 複数のライブラリを1つのLayerにまとめて、Layerの数を抑えたい
– 最新だけでなく、任意のバージョンのライブラリを使いたい
– Klayersでは、自動で旧バージョンのレイヤーが削除されて使えなくなってしまうため、Layerを自己管理下に置きたい
– 宗

元記事を表示

【AWS Lambda/CDK】RSSフィードをツイートするBotを作るLambdaファンクション作ってみた

# 作ったもの

特定のTwitterアカウントをRSSリーダBot化するLambdaファンクションを作ってみました。CDKで構成を管理&デプロイします。

https://github.com/kuredev/rss2witter

# 仕組み

– AWS LambdaでRSSフィードを読み込み、ツイートします
– CloudWatch Eventsで定期実行します
– RSSフィードのURLはLambdaファンクションのコードで管理します(他に手軽な方法が思いつかなかった)

# 準備

## Twitterアカウントを準備する

Botとするアカウントを準備し、Developer Portalで以下のキーを取得します。
取得には電話番号の登録や、メールの返信等が必要なようです。

– consumer_key
– consumer_secret
– access_token
– access_token_secret

## RSSフィードを読み込みツイートするRubyスクリプト

全体のコードは[こちらのリポジトリ](https://github.com/kuredev/rs

元記事を表示

How to use AWS Signer for Lambda security

I would like to check the features of AWS Signer in the following steps.
`以下の流れでAWS Signerの機能を確認します。`

1. Create sample python code for test of AWS Signer / 検証用サンプルPythonコードの作成&デプロイ
1. Confirmation of lambda function / Lambda関数の稼働確認
1. Create Signing Profiles using AWS Signer / AWS Signerにて署名プロファイルの作成
1. Create Signing Jobs using AWS Signer / AWS Signerにて署名ジョブの作成
1. Create code signing configuration / コード署名設定の作成
1. Change the setting in lambda function / Lambda関数の設定変更(署名された関数以外デプロイ不可

元記事を表示

Slack App(issue-alize for Redmine,Backlog)の開発して分かったこと

# はじめに
SlackメッセージからRedmineのissueを登録するアプリ(issue-alizeと言います)を開発しました。
[issue-alize for Redmine](https://tailshape.slack.com/apps/A01NTCE2G4A-issue-alize-for-redmine)
[issue-alize for Backlog](https://tailshape.slack.com/apps/A01F1AABZQW-issue-alize-for-backlog)
そのSlackAppの紹介と開発する上で少し困った点およびSlack App Directoryへ登録のメリットなどを記載します。

# 開発しようと思った経緯
– Slackの会話上でタスクを振られることが多く、それをRedmineに手動で登録していた
– その際、SlackのメッセージをコピペしてRedmineに登録するのが発狂しそうな作業だった
– SlackのメッセージをIssueとしてRedmineに登録するアプリがSlack App Directoryに見当たらな

元記事を表示

OTHERカテゴリの最新記事