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

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

QuarkusでAWS Lambdaを作る

Quarkus(https://quarkus.io/) とは`SUPERSONIC SUBATOMIC JAVA`で、

> A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards.

だそうです。
何言ってるかわかりませんがすごそうです。

GraalVMの機能でJavaのプログラムをネイティブに変換することが可能なので、AWS Lambdaのカスタムランタイムと組み合わせることで AWS Lambda上で動作するJavaアプリケーションの特性である **コールドスタートが遅い問題** の解決に期待ができます。

公式サイトの手順に従い試してみましたので、手順を残します。

QUARKUS – BUILDING A NATIVE EXECUTABLE
https://quarkus.io/guides/building-native-image

QUARKUS – AMAZ

元記事を表示

QuarkusがJava Lambdaを救う!?

すごいですQuarkus!!!!!!
JavaのLambdaのコールドスタートがチョッパヤです!!

以下の公式サイトを参考に試しました。

https://quarkus.io/guides/amazon-lambda#tracing-with-aws-xray-and-graalvm

# テスト対象

前回の[AWS LambdaのJavaは遅い?](https://qiita.com/moritalous/items/632333088948aad7f8c9)とほぼ同じですが、以下が異なります。いずれもQuarkusの制限?制約?です。

* アノテーションが付いてる
* httpClientがUrlConnectionHttpClient

ソース全体

“`java
package example;

import javax.inject.Named;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.s

元記事を表示

AWS CLI で InvocationType が RequestResponse なのにLambda関数が複数回呼び出される

# TL;DR
–cli-read-timeout オプションで0を設定するか、呼び出すLambda関数のタイムアウト時間の秒数を指定する。

# 事象
Lambda関数で60秒を超える処理を行った際に AWS CLI で InvocationType が RequestResponse なのにLambda関数が複数回呼び出される。

# 原因
AWS CLI の lambda invoke はデフォルトでは60秒間でタイムアウトし5回まで再実行されるため。

# 確認
以下のようなLambda関数を用意します。指定した秒数、スリープで停止するLambda関数です。Lambda関数名は sleep とします。
タイムアウト時間は900秒(15分)にでも設定しておいてください。

“`python
import json
import time

print(‘Loading function’)

def lambda_handler(event, context):
print(“Received event: ” + json.dumps(event, indent=2

元記事を表示

AWS SNSが重複してメッセージを配信してしまう

よくAWSに触れるものです。

AWS SNSでちょっとハマりました。

# 問題
AWS SNSからlambda経由で何故かメッセージの送信に成功しているのに重複してメッセージが送られてきます。

そもそもSNSからlambdaに対して重複して配信しているようでした。

配信再試行ポリシーの“`numRetries“`を0にしても解決しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249038/ffa81572-9d55-109b-f790-95539a3420f6.png)

# 解決
lambdaで処理を終える際にresponseメッセージで成功ステータスを送る必要がありました。
(以下はpythonですが、他の言語も同様)

~~~python
##lambda関数内

def main()

return {
‘statusCode’: 200
}
~~~

以上で重複配信がなくなります。

元記事を表示

AWSサーバーレス連絡フォームの作り方?(AWS Lambda、API Gateway、SES)

AWS S3にサイトを安くて簡単にホスティングできますが、S3は静的なサイトしかホスティングできないですので、従来ならバックエンド処理が必要となるフォーム送信の実装などは難しそうですね。しかし、クラウド時代ではそんな心配はありません!ソリューションはサーバーレスアーキテクチャです!AWSはすでに色々なサーバーレス構築のツールを提供しています。

今回はユーザからお問い合わせやフィードバックを送信するたびに、任意な宛先に通知メールを送信するシンプルなサーバーレスメールサービスを一緒に作ります。AWS LambdaとAPI Gatewayを利用し、簡単なAWSサーバーレス構築を紹介します。

構成図はこんな感じです。
![diagram.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665134/fe6fb6dc-e62e-4eaa-0a50-776a74b19ac4.png)

処理の流れとしては、ユーザーから連絡フォームより入力した情報を収集し、クライアント側のブラウザからAmazon API Gat

元記事を表示

EFSにセットアップしたPythonライブラリをLambdaにimportする方法

# はじめに

**Lambda**に**EFS**をマウントできるようになりました。これによりEFSにセットアップしたPythonのライブラリをLambdaにimportできるようになりました。

これまでは、LambdaにPython標準以外のライブラリをimportしたい場合は、Lambda layer に固めてアップロードする方法しかありませんでした。しかし、この方法には `圧縮して50MB以下、解凍後250MB以下というサイズの制限`があります。このため、サイズの大きいライブラリを複数使うといったことができませんでした。そのため、少し規模が大きいシステムだと、一部処理をdockerに外出しするなどの対応が必要となり、Lambdaだけでは完結しませんでした。

しかし、LambdaにEFSをマウントできるようになったため、この問題が解消します。`EFSにインストールしたライブラリをLambdaにimportできるようになりました。`

# how to

## 概要

1. EFS作成
2. EFSアクセスポイントを作成
3. EFSを作業用にEC2にマウント
4.

元記事を表示

【AWS-CDK】認証付きWebAPIをSolutions Constructsを使って手軽に構築

## Solutions ConstructsでAWSインフラ構築
先日、[AWS Solutions Constructs](https://aws.amazon.com/jp/blogs/news/aws-solutions-constructs-a-library-of-architecture-patterns-for-the-aws-cdk/)が発表されました。これはAWS-CDKにおいて、抽象化されたリソースを表す`Constructs`のよく使う組み合わせをWell-Architected準拠の設定込みで一発で構築できるライブラリです。例えば`Lambda + DynamoDB`や`CloudFront + S3`などの組み合わせのパターンが25個(2020/7月現在)提供されています。

+ https://docs.aws.amazon.com/solutions/latest/constructs/api-reference.html

これをつかってパパっとAWS上にWebAPIを構築したいと思います。

## 注意
2020/7/6現在、Solutions

元記事を表示

Lambda@EdgeでレスポンスにHTTPヘッダを付与するやつをGitHub Actionsで自動デプロイする

# 概要

– フロントにNuxt.jsを採用していると、`npm run start`するだけだと`X-Frame-Options`とか`CSP`とか`x-xss-protection`といったヘッダがレスポンスに付与されない
– `Fastify`をNodeサーバーとして使っているのでそちらで頑張ってもよかったけど、せっかくAWSで`CloudFront`->`ALB`->`Fargate`な仕組みを使っているので、AWSで頑張ってみようと思った
– Lambda@Edgeを使って、Nuxtからのレスポンスにヘッダを付与するやつを組んだ
– アプリケーションと連動して動いたほうがいいし、手動でデプロイする運用がしんどいと思ったので、GitHub ActionsでCLIベースの自動デプロイが組めるところまで持ってきた
– それをやるがためにCloudFormationまで導入しててんやわんやした

日本語文献がそんなになかったので、まとまりがないメモですが貼っておきます。

# Lambda@Edgeのソース内容

下記ブログを参考にしました。CSPだけ模倣するわけにいかなかったので

元記事を表示

AWSハンズオン実践メモ 〜サーバーレスアーキテクチャで翻訳 Web API を構築する〜

# はじめに
AWS公式の[ハンズオンシリーズ](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/?trk=aws_blog)の中から、翻訳 Web API の構築を通して、サーバーレスアーキテクチャの基本を学ぶ[ハンズオン](https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Serverless-2019_LP.html?trk=aws_introduction_page)を実施しました。

本記事は自身のハンズオン学習メモとして投稿します。
# 目次
– [ハンズオンの目的](#ハンズオンの目的)
– [本編](#本編)
– [おわりに](#おわりに)

# ハンズオンの目的

– AWS Lambda, Amazon API Gateway, Amazon DynamoDB の基本を学ぶ
– 上記のサービスを組み合わせて、サーバーレスな Web API を作成する

>翻訳 Web API の構築を通して、サーバーレ

元記事を表示

SAM CLI の Docker内(–use-container) ビルドをProxy環境下で実施する方法

2017年頃からサーバレスに浸っている、小西啓介です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40049/f960c804-b36c-2893-1ae5-eed795f20606.png)

# SAM CLIでは、Lambdaに近い環境でビルドできる

SAM(Serverless Application Model) CLI のビルドコマンド(`sam build`)には、
Lambda用の `npm` や `pip` などで、アーキテクチャ(WindowsかLinux等)に依存するモジュールが有る場合に対応する
オプション (`–use-container`)がある。

このオプションを使用すると、通常、実行環境(windows等)で行うビルド処理を、Lambda(Amazon Linux) に近い
Docker環境内で行うようなるため、コンパイルを伴うような場合でも問題なく(※文末参照 2020/07/10追記)、Lambda用のリソースを作成することが可能とな

元記事を表示

Laravelのマイグレーションで「Application In Production!」が表示されたときの対処法

# はじめに
本番環境でマイグレーションを実行したら、以下のメッセージが表示されて、マイグレーションが実行されなかった。

“`
**************************************
* Application In Production! *
**************************************
“`

# 環境
“`
$ php artisan -V
Laravel Framework 5.8.29
“`

# メッセージが表示された理由
productionでマイグレーションを実行する場合、以下のメソッドで環境のチェックが行われ、productionの場合はメッセージが表示されます、

“`/vendor/laravel/framework/src/Illuminate/Console/ConfirmableTrait.php

元記事を表示

.NET Core アプリを AWS Lambda で動かす

# 本投稿について

この投稿では、以下の方法について説明しています。

1. .NET Core で AWS Lambda 関数を開発する方法
2. Lambda 関数として動かすことができる ASP.NET アプリの開発方法
3. 既存の ASP.NET Core アプリを Lambda 関数として動かす方法

(※ 本記事は、2020/06/22時点での最新の.NET Core バージョンや各種ツールを使用することを想定に書いています)

# 1. .NET Core の Lambda 関数を作成する

ここでは .NET Core で Lambda 関数を開発する方法について説明します。

## プロジェクトテンプレートをインストールする

まず、以下のコマンドで[Amazon.Lambda.Templatesパッケージ](https://www.nuget.org/packages/Amazon.Lambda.Templates)をインストールしてプロジェクトテンプレートを追加します。

“`
dotnet new -i Amazon.Lambda.Templates

元記事を表示

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でのモック化

2017年頃からサーバレスに浸っている、TISの小西啓介です。

![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` に対して

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事