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

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

LambdaをCanaryリリースするSAMテンプレートに自動ロールバックを組み込む

# はじめに
LambdaのCanaryリリースは非常に便利。自動でトラフィックコントロールをして様子を見ることができる。
しかし、クラウドネイティブなリリースの完成は、万が一の状況を検知した場合は自動でロールバックすることだ。
今回は、過去に作ったSAMテンプレートに自動ロールバックを組み込んで実際の動作を確認する。

# 前提条件
– SAMテンプレートでCanaryリリースの設定を書いたことがあり、ある程度内容を理解している。特に、“`AutoPublishAlias“`と“`DeploymentPreference“`の概要と、“`LambdaPermission“`を設定しなければいけない理由が分かっているのが望ましい ⇒ [過去の記事](https://qiita.com/neruneruo/items/73906cdc3c2aa699644f)でも紹介してるよ!
– CloudWatchアラームをなんとなく分かっている

# SAMテンプレートを書く前に
ロールバックの設定は、SAMテンプレートの“`AWS::Serverless::Function“`リ

元記事を表示

X-RayのSAMとLambda内への組み込みとjestでのモック化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40049/a3cf8470-1e9b-e715-9505-7a6f5a123e3c.png)

# 概要

SAM(Serverless Application Model)を使ったnode.jsのLambdaプログラム等に対して、
パフォーマンス計測等を行いX-Ray機能の組み込みについて説明します。

また、X-Ray機能を組み込むと、aws-sdk-mockを使用したユニットテストでは
通らなくなるので、aws-xray-sdkのモック化についても説明します。

# SAMへのX-Rayの追加

API Gateway – Lambda – DynamoDBのような構成だとして、
SAM(Serverless Application Model)へのX-Rayの組み込みは、
以下のように、SAMのテンプレーレートのGlobalセクションの
`Function` に対して、`Tracing: Active`と
`Api` に対して、`T

元記事を表示

AWS LambdaからRDSへの接続はアンチパターン?Lambdaのコールドスタートとは?対策とは?

# VPC LambdaからRDSの呼び出しはアンチパターンだったらしい
Lambdaを起動すると、VPCLambdaで起動する。
VPCLambdaは以下の点で、アンチパターンと言われていた
– 特定の状態において、遅延が発生(ENI作成に伴うコールドスタート)
– Lambdaの同時実行によりVPC内のプライベートIPを消費するため、アドレス管理が必要。
– RDSの最大同時接続数以上に、Lambdaが起動した場合は、接続エラー。

だが最近
[Hyperplane ENI](https://aws.amazon.com/jp/blogs/news/announcing-improved-vpc-networking-for-aws-lambda-functions/)
[RDS Proxy](https://aws.amazon.com/jp/rds/proxy/)
のアップデートがあり、解消されつつある。

# Lambdaコールドスタートとは?
Lambdaには、コールドスタートという概念が存在する。
コールドスタートとは、Lambdaの初回実行次に内部的に以下の処理が行

元記事を表示

Golangはじめて物語(APIGateway+Lambdaといっしょ編)

# はじめに
Lambda関数を色々触っていると、Javaの限界を感じることが多い(別にJavaをdisるわけではなく、Lambdaとの親和性と言う意味ではイマイチだと主張したい)。

手軽さで言えばPythonは間違いなく最強の一角だと言えるが、importが増えると結局処理が重くなるという話があり、Golangを勧められる機会が増えてきたので、ここらで一丁、覚えてみようと思った。

# 統合開発環境は何が良いか?
色々と試してみたわけではないが、Eclipseは重いし、Golang拡張はJDKのバージョン縛りがあって面倒だったので、VSCode+Remote Development Extension Pack+EC2にしてみたら非常に快適だった。ローカル環境がWindowsで動かせるモノの制約が面倒だというのもあるので、この構成はオススメ。
Go言語だけ触るなら別に何の環境でも良いのだけど、SAMなりServerless Frameworkなりcurlなりを並行で触ることを考えると、EC2を直接触れるというのは生産性に大きく貢献してくれる。

Remote Development

元記事を表示

AWS Lambda 待望の RDS Proxy を CloudFormation で作ってみる

2020/06/30、RDS Proxy がプレビューを終了し、ついに GA (正式リリース) となったことが[発表](https://aws.amazon.com/jp/blogs/aws/amazon-rds-proxy-now-generally-available/)されました。

これまでアンチパターンと言われていた、AWS Lambda と RDS との接続について解決策のひとつとなることから、サーバーレス界隈では待望の機能であったと思います。

この記事では、CloudFormation でこの RDS Proxy を作ってみたいと思います。が、その前に、RDS Proxy について少し振り返ってみたいと思います。

# RDS Proxy は AWS Lambda にとって何が嬉しいのか

AWS Lambda はいわゆるサーバーレスのサービスです。そのため、常在的に起動しているリソースは基本的にありません。なんらかのイベントが発生したことを契機に、Lambda 上で実装したアプリケーションを動作させるためのリソースがスピンアップするので、例えば HTTP 要求が着信し

元記事を表示

【Python】Lambdaで定期的にCloudWatch LogsからS3へエクスポートする

[【AWS】CloudFormationでS3バケット作成とライフサイクルルールを設定する](https://qiita.com/homines22/items/e28e8ec51ca562effc6e) で作成したS3にCloudWatch Logsに保存しているログを定期的にエクスポートするLambdaをPythonで開発したお話です。

簡単に試せるようにGitHubリポジトリを作成しておきました -> [homoluctus/lambda-cwlogs-s3](https://github.com/homoluctus/lambda-cwlogs-s3)

# 要件

– 毎日JST14:00に前日のログをエクスポート
– 複数のロググループをエクスポート可能

# 開発

## 言語

– Python3.8

## 開発ライブラリ

– isort
– mypy
– flake8
– autopep8

## 本番ライブラリ

– boto3
– boto3-stubs (type annotation用)

## デプロイメントツール

– Serverless Fram

元記事を表示

Private subnet内でNAT gatewayを介さずにlambdaからlambdaを呼び出す

###はじめに
 だいぶ特定領域の話になりますがとあるプロダクト開発にあたってちょっとした知見を得たので後学のために残しておきます。

###構成
 まずは今回の構成を一部分だけピックアップしたものが以下のものになります。
![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53020/b3bb5d94-27c4-a3d5-75a7-3e672c810782.png)
 要件としては、プライベートサブネット内で動いているサービス(今回であればECS上で動かしています)からマイクロサービスとして切り出した同じくプライベートサブネット内のlambdaを呼び出し(invoke)、さらにそのlambdaから別のlambdaを呼び出す。
ただし、lambdaからVPC内のリソースにアクセスするためにlambdaをVPC内に置く必要があると言った具合です。
 この場合同じVPC内なため、セキュリティグループを適切に設定すればECSからlambdaを呼び出すことはうまくいきますが、lambdaから別のlam

元記事を表示

CodeCommitにcommit/pushしたらLambda経由でSlackにcommentつき通知を飛ばす

AWS CodeCommit上で管理しているリポジトリに、誰かがcommit/pushしたらSlackで通知を受け取りたいと思って試行錯誤したときのメモになります。Lamda関数はNode.jsで記述しています。

# スクリーンショット

screenshot.jpg

※ アイコンとCodeCommitの太字はSlack Incomming Webhookのカスタマイズで変更しています。

# 前置き

* CodeCommitやLamda、Slackの細かい話は書きません。
* Lamda関数のNode.jsのサンプルコードや注意点だけを書きます。
* 以下はすべてAWS Console上からの操作です。

# 処理の流れ

CodeCommit → トリガー → Lambda → Slack Inco

元記事を表示

サーバレスアーキテクチャにおけるアクセス制御について

# はじめに

Webサービスには、認証・認可が必要な場合が多く、それをアプリで実現しようとすると手間が掛かります。
サーバレスアーキテクチャでは、認証・認可をAWSのサービスをうまく使って実装することで、開発にかかる期間を短縮できます。
また、IDやパスワード忘れなどのよくある問い合わせにも、一切コードを書かずに対応できる仕組みがあります。

# 認証と認可

混同しがちなのですが、認証と認可を改めて確認してください。

よくわかる認証と認可
https://dev.classmethod.jp/articles/authentication-and-authorization/

## 認証

通信の相手が誰(何)であるかを確認すること。

## 認可

とある特定の条件に対して、リソースアクセスの権限を与えること。

# AWSサービスそれぞれの役割

API Gateway、Cognito、Lambdaの3つの役割を記載します。

– API Gatewayは、アプリケーションがバックエンドサービスからのデータ、ビジネスロジック、機能にアクセスするための「フロントドア」とし

元記事を表示

S3に保存されたMP3ファイルをLambdaでGoogle Cloud Speech-to-Textを使って文字起こしする

# S3に保存されたMP3ファイルをLambdaでGoogle Cloud Speech-to-Textを使って文字起こしする

## はじめに
前回の[S3に保存されたwavファイルをLambdaでGoogle Cloud Speech-to-Textを使って文字起こしする](https://qiita.com/haruhiko28/items/55cc892eb2c41f8f12cf)に引き続き、
今回はMP3ファイルを対象に、S3に保存されたMP3ファイルをLambdaでGoogle Cloud Speech-to-Textを使って文字起こしする手順をまとめます。

重複する点が非常に多いので、相違点になるコードの部分だけ([前回](https://qiita.com/haruhiko28/items/55cc892eb2c41f8f12cf)でいう5-9のみ)ご紹介します。

## Code
実行するコードは以下になります。

“`javascript
const AWS = require(‘aws-sdk’);
const speech = require(‘@googl

元記事を表示

AWSでRESTで送信したものをWebSocketでリアルタイムに受け取るサーバレスシステム

#はじめに
オンラインイベントで応援ボタンなど押した時に、現地で一方向の情報として受信し、それをトリガーにエフェクトなど表示したいことがあります。
方法としてはSocket通信や、MQTTなどを利用したり、ngrokなどのローカル環境をネット上で受けれるようにするサービスを使うなどあります。
ただ、クライアントが数百人など多数の環境になるとソケットを大量に張る必要がある、サービスの上限制限や毎回URLが変わるなど運用が面倒なことなどが考えられます。
今回はそれらを回避しつつ、サーバレス環境でコストも少なくしたシステムを作ってみます。

#全体構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58795/13a3d737-ea38-411f-c338-5e2f3abfc591.png)

送信する方はRESTで送ることで接続数に依存せずコストを下げることが可能です。
特にいつ押されるかわからないため、無駄にSocketなどを張って時間課金のコストを増やすということをしないようにします。

元記事を表示

DynamoDB Streamを用いて、日付のパラメータを与えながらLambdaを繰り返し呼び出す

## はじめに
パラメータを変えながらLambdaを繰り返し実行したくてDynamoDB Streamを使いました。参考までにと思い投稿してみました。

この記事ではAWS LambdaからDynamoDBに日付などの数字を書き込んだのち、DynamoDB Streamを用いて同じLambda関数を呼び出し、書き込んだ日付について処理を行う実装をします。
ランタイムはPython3.8を選択しています。
Lambdaの設定で「ハンドラ」は「lambda_function.lambda_handler」であるものとし、
LambdaのロールにはDynamoDBFullAccess権限が付与されています。

### この方法を使ってよかったこと

自分の場合はS3でyyyymmddフォルダに入ったファイルを処理する必要に迫られましたが、
Lambdaの性質上+自分の技能上の都合で、「どのファイルを処理するか/したか」をどこかに持たないと再実行は実装できませんでした。が、大量のファイル名をリクエストに手書きする訳にもいかず・・・

そんな悩みをここに書いてある方法で解決することが出来ました。

元記事を表示

vue.jsでzlib.jsを利用して圧縮データをPOSTしてみた

## 問題
aws lambdaへCSVファイルをPOSTする際にペイロードが6MBに制限されているため、クライアント側で圧縮する方法を調査してみました。
lambdaのペイロード制限に関しては下記に記載があります。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html

## 事前準備
zlibjsというライブラリを利用するため、下記のコマンドでインストールを行います。
`npm i zlibjs –save`

## 実装例
“`html