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

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

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に見当たらな

元記事を表示

AWS Lambda layersを作成/管理できるツールlamblayerを作った

AWS Lambda layersを作成/管理できるツールlamblayerを作りました!
現在はPythonにのみ対応しています。

https://github.com/YU-SUKETAKAHASHI/lamblayer

## できること
– pipでinstallできるpakcageのビルド済みlayerを作成する(←これがとっても便利)
– ローカルのディレクトリからlayerを作成する
– Lambdaにlayerを設定する

jsonの設定ファイルからパラメータを読み取って内部でLambdaのAPIを叩いています。

## Quick Start
現在はpipでのみインストール可能です。
`pip install git+https://github.com/YU-SUKETAKAHASHI/lamblayer.git@v0.1.0`

`lamblayer init`で既存のLambdaを取り込みます。

“`
$ mkdir quick_start
$ cd quick-start
$ lamblayer init –function-name quick_s

元記事を表示

Lambdaの名前を変えただけなのに

## はじめに

[本番環境でやらかしちゃった人 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/yarakashi-production) に懺悔の意味も含めて投稿させていただきます。@kyntkです。

思い出すだけで、今でもあの時が鮮明に思い出されて心臓が締め付けられる思いをするので正直書くのも辛かったのですが、二度と惨劇を繰り返さないためにということで書きます。

https://qiita.com/advent-calendar/2021/yarakashi-production

:::note warn
現在の所属はQiita株式会社ですが、この事故は今の会社ではない時に起きたものですので、Qiitaとは一切関係ありません。
:::

ちなみに、Qiita株式会社もカレンダーを作っているので、よろしければこちらも合わせて見てみてください。

https://qiita.com/advent-calendar/2021/qiita

## やりたかったのは、ただLambdaの関数名を変えること

元記事を表示

ラジオで今流れている曲を Slack に投稿する

現在の職場でラジオを流しているのですが、たま~に気に入った曲があって、調べたりします。
ですが、いちいちラジオ局のサイトを開いて流れている曲を検索するのが実に面倒です。
なので、定期的にラジオ局のサイトを見に行って、流れている曲を見つけて投稿してくれるアプリを作りましょう?

例として、ここでは TOKYO FM で流れている曲を毎分調べて Slack に投稿するというシチュエーションを設定します。

今回使用する AWS のサービスは以下の通りです。

– Lambda
– Secrets Manager
– IAM
– CloudWatch Logs
– EventBridge (CloudWatch Events)

## 前提

– AWS アカウントを持っている
– Python をインストールしている
– Slack のアカウントとチャンネルを作成している

## オンエア曲のサイトを見てみる

TOKYO FM のオンエア曲一覧はこちらで確認することができます。

https://www.keitai.fm/search/view/au/

![tokyofm-np.pn

元記事を表示

AWS CLIで Web サイトを構築、管理、運用する(24日目)

24 日目!
世の中はクリスマスイブ!
ということで、今日は、API Gateway から、昨日作った AWS Lambda 関数をつなぎます。
もちろん、AWS CLIで。

# 24日目の要約
API!

# AWS CLI の準備
このあたりをみて、好きなバージョンとお使いのOSにあった環境設定をしてくださいね。
なんなら、 AWS CloudShell で実行するのも楽でよいと思います。
この記事シリーズは、AWS CloudShell で実行し、実行例を載せています。

バージョン1
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html

バージョン2
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

# 概要
API Gateway を作って、リクエストを受けたら Lambda 関数に処理させます。

# さあ、やってみよう!
今回は API Gateway の REST API を

元記事を表示

AWS CLIで Web サイトを構築、管理、運用する(23日目)

23 日目!
今日は、AWS Lambda 関数を作ってみます。
もちろん、AWS CLIで。

# 23日目の要約
サーバレスコンピューティング!

# AWS CLI の準備
このあたりをみて、好きなバージョンとお使いのOSにあった環境設定をしてくださいね。
なんなら、 AWS CloudShell で実行するのも楽でよいと思います。
この記事シリーズは、AWS CloudShell で実行し、実行例を載せています。

バージョン1
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html

バージョン2
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

# 概要
AWS Lambda 関数を作成します

# さあ、やってみよう!
## AWS Lambda 関数用の IAM ロールを作る
Lambda 関数がログを出力するために使う IAM ロールを作っていきます。
まずは “`iam cr

元記事を表示

サブスクリプションフィルターで、あるLambdaの出力したログを、別のLambdaに渡す

[フューチャー Advent Calendar 2021](https://qiita.com/advent-calendar/2021/future)の23日目の記事です。

昨日は、[@hayao0727](https://qiita.com/hayao0727) さんによる
[AxumでGoのチュートリアル「Writing Web Application」をやってみた](https://qiita.com/hayao0727/items/d05b4c3c0b05d219c3bc) でした。

私自身、今年のフューチャーのアドカレ枠では既に2本投稿しているのですが、ラストに向けてガンバっていきます。

投稿した2本はこちら

– [AWS KMSとOpenSSLでエンベロープ暗号化](https://qiita.com/RuyPKG/items/21d397516c2df2f0c45a)
– [【入門】QuickSight × S3 でデータ可視化](https://qiita.com/RuyPKG/items/c32282fe57c33346a534)

# はじめに
みなさんは

元記事を表示

今ホットなLog4j脆弱性対応をきっかけにJava版LambdaをDocker版Lambdaへ急遽構成変更した2021年の末

この記事は [マイナビ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mynavi) の22日目の記事です。

そろそろクリスマスが近づいて参りました。
只今12月20日の23:21です。明日の昼12時までにこの記事を書き上げる必要があります。(いつもギリギリや・・)

今回は、2021年末に世間を騒がせている大変ホットなLog4J脆弱性対応をきっかけに、今更ながらDocker版Lambdaを試してみた!という記事を書こうと思います。

実は他のネタを書こうと思っていたのですが、Log4j脆弱性関連の対応により、こんなタイミングで平日だけでなく土日も溶かしてしまったためLog4J対応しか用意できる記事がないや!ってこととなりこのネタにしました!!わーいわーい :laughing:

# お話の概要
– 技術キーワード
– aws lambda(Java)
– aws lambda(Docker)
– 脆弱性発覚からLambdaのDocker化までの流れ
– Log4j脆弱性により、本L

元記事を表示

OTHERカテゴリの最新記事