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

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

LambdaでJava入門しようとしてハマった

# 経緯
普段はNode.jsで開発していますが、LambdaでJavaを使うテストをしている方がエラーで行き詰っていたので一緒に調査しました。

# 結論
Lambdaのハンドラー設定が間違っていました。
デフォルトでは、`example.Hello::handleRequest`
だったのを、
`com.example.Hello::handleRequest`
に変更したところ実行できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162215/f1710c19-7996-6947-61f9-eb0eed391293.png)
[こちら](https://qiita.com/niwasawa/items/69bba64d7cd2d6277473)の記事を参考にしました。

# 何しようとしてたの?
LambdaでJavaを使用するのが初めてだったので、まずは[こちら](https://blog.mmmcorp.co.jp/blog/2020/03/29/lambda-ha

元記事を表示

aws lambda で UnauthorizedOperation エラー

aws の lambda で EC2 のリストを生成したく、describe_instances(python3.8/boto3)を実行したら以下のエラー。

“`
Response
{
“errorMessage”: “An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.”,
“errorType”: “ClientError”,
“stackTrace”: [
” File \”/var/task/lambda_function.py\”, line 8, in lambda_handler\n response = ec2client.describe_instances()\n”,
” File \”/var/runtime/botocore/client.py\”, line 357, in _api_call\n

元記事を表示

PrismaのMigrationをAWS Lambdaで実行する

# はじめに
TypeScript用のORMである[Prisma](https://www.prisma.io/)は、DBのスキーマをMigrationという方法で管理することができる。
ActiveRecordのMigrationとよく似ており、`CREATE/ALTER TABLE`のSQLクエリを順次適用していく感じのもの。

Migrationは、DBと疎通している環境から `prisma migrate` というコマンドを打つことで適用できる。
本記事では、このPrismaのMigrationをAWS Lambdaでサーバーレスに実行する方法を紹介する。

# 方法
大まかなアーキテクチャは下図。
なお本記事はDBがAWS上にあることを前提としているが、他のクラウドでも同様の方法は取れるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127392/70ef0478-3cda-92f2-6caa-edab85306975.png)

実際のコードは、[こちらのリポジトリ]

元記事を表示

[serverless]AWS Lambdaでnode-canvasを利用した画像生成をする

# 前書き
OGPの生成などnode.jsで画像生成をしたいというケースは最近増えてきているのでは無いでしょうか。その中でもクライアントで実行可能な[Canvas](https://developer.mozilla.org/ja/docs/Web/API/Canvas_API)を利用したいケースというのも同様に多いと思います。

またサーバーレスの台頭と共にデプロイに[serverless](https://www.serverless.com/)を利用しているケースもあると思います。

私自身がその様な環境で試す中、実行するまでに躓いた箇所があったので実際に動く簡単なアプリを作りながら途中の問題の解決法を解説していこうと思います。

# 実行環境
デプロイ: [serverless](https://www.serverless.com/)(テンプレート: [aws-nodejs-typescript](https://github.com/serverless/serverless/tree/master/lib/plugins/create/templates/aws-node

元記事を表示

EC2の一覧を必要な情報だけ絞ってS3へ日次保管

### 実装の方法

LambdaのPython(boto3)を使います。
1日1回実行するトリガーとして、EventBridgeを使います。

### 実装できると何がうれしいのか

**1点目**
EC2のdescribe_instances APIは、取得結果が冗長なデータ構造となっていて、Javascriptなどで取り込んだ時にやや扱いにくいです。
特に、`Reservations[*].Instances[*]` の階層の深さと、タグの構造が `[{‘Key’: ‘タグキー名’ }, {‘Value’: ‘タグの値}]` となっている点が冗長でしょうか。
階層を単純な1次元配列(Pythonのリスト)とし、欲しい情報だけに絞ることで、プログラムから扱いやすくなります。

**2点目**
AWSのAPI/CLIでは、**”現時点の”**EC2の一覧を取得できますが、**”x月x日時点の”**EC2の一覧を取得したいとなった場合に、急に困ることになります。
1日1回Lambdaを実行して蓄積しておくことで、簡単に調べられるようになります。

### IAMロールの作成

IAM

元記事を表示

AWS IoT検証メモ③:IoT action

公式ドキュメント
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-rule-actions.html

##IoT action とは
IoT rure で受け取ったTopicのデータを他のサービスへのアクションにつなげるのがIoT action。
IoT rule内でこのIoT actionを設定することでAWS IoT Coreと他サービス間でデータ連携を行うことができるようになります。
ここでは比較的簡単にサービス間の連携を行うことができる方法として、

– AWS IoT Core->AWSの他サービスへのデータ連携
– AWS IoT Core->RESTを使った他サービスへのデータ連携

の2点について説明していきます。

IoT rule自体の説明は以下の記事を参考にしてください
https://qiita.com/tomzono/private/12f6253c864f8f8c4070

## AWS IoT Core->AWSの他サービスへのデータ連携
IoTRureを使ってAWS

元記事を表示

Vue.js + axiosでLambdaのAPIを叩く方法

# 開発環境
+ Windows10
+ AWS Lambda
+ Vue.js

# APIの作成
## Lambda
“`python:lambda.function.py(GET)
import json

def lambda_handler(event, context):
items = [‘福岡’,’佐賀’,’熊本’,’大分’,’鹿児島’,’長崎’]
return {
‘statusCode’: 200,
‘body’: json.dumps(items),
‘headers’: {
‘Access-Control-Allow-Headers’: ‘*’,
‘Access-Control-Allow-Origin’: ‘*’,
‘Access-Control-Allow-Methods’: ‘OPTIONS,POST,GET’
}
}

“`

“`python:lambda.function.py(OPTI

元記事を表示

AWS CloudFormationでLambda Layerを使用したSlack通知定期実行Lambdaを構築しよう

# はじめに
AWS CloudFormationを利用してLambda Layerを使用したSlack通知定期実行Lambdaの構築のテンプレートのサンプルです。
CloudWatchにて、Lambdaを定期実行します。また、Lambdaは、S3アーティファクトを使用します。
通知内容は起動しているEC2インスタンスを停止する際の情報になります。

テンプレートの概要が分からない場合は、[はじめてのAWS CloudFormationテンプレートを理解する](https://qiita.com/miyabiz/items/eb7b0fa1675b5199b9b7)を参考にしてください。

コードは[GitHub](https://github.com/miyabiz-room/CloudFormation-Template/tree/lambda-02)にもあります。

今回は、akane というシステムの dev 環境を想定しています。
同じ構成で違う環境を作成する場合は、{環境名}-parameters.jsonを別途作成します。

“`text:ディレクトリ構成
akane

元記事を表示

AWS Lambda (Python 3.8)&Wrike APIで取得したjsonをパースし任意のキーで取り出してみる。

#この記事の概要
https://qiita.com/katoiek/items/b2fb9ce7ad759e5fb5aa
の続き。

せっかくなのでほしい要素を取り出してみる。

#本記事の投稿者
前も来ましたがPython&Lambda初心者(両方とも初めて書いてみた)なのでセオリー的なPerseの仕方などはわからないので力技です。

#大まかな手順
Wrikeで永続トークンを生成し、LabmdaでPythonの関数つくって実行し、かえって来たクエリの任意のキーを取り出す。

#今回の目的
サンプルソースからpermalink要素を抜き出す。
今回はpermalinkをキーとしましたが、その他クエリに使えそうなキーはWrike公式APIリファレンスを参照してください
https://developers.wrike.com/api/v4/tasks/#query-tasks
→こちらのResponseです。

#APIからのレスポンス(例)
“`sample.json
{
“kind”: “tasks”,
“data”: [
{

元記事を表示

Python lambdaでの処理

# はじめに
Pythonのlambda式を自身がよく忘れてしまいがちなので, メモとして残しておきます.
他の方の参考にもなればと思います.
`間違っている箇所もあると思いますので, コメントしていただけると幸いです.`

Pythonはdef()で関数を定義しますが, lambda式で無名関数を定義することができます.
**def()** を用いた関数の場合、引数として直接他の関数に渡すことができず, 違う場所で定義してから値を渡す必要があるのに対して, **lambda式**は, あくまで「式」であるので, 関数の引数として直接渡すことができます!!!!

次の節から例を紹介していきます.

# def文とlambda式の対応関係

“`python
def add(x, y=1):
return x+y

print(add(1,2))
# 3

print(add(100))
# 101
“`

上記のdef文を, lambda式に変換した場合

“`python
f = lambda x, y=1: x+y

print(f(1,2))
# 3

print

元記事を表示

Lambdaで I/O Errorが発生した場合の対応

# はじめに
個人的な備忘録が目的です。
言語は Python のみですが、考え方は他の言語にも流用できるかなと思います。

# 問題点
Lambdaでファイル作成系のコマンドを実行すると、たまに `I/O Error` 発生したりします。
例えば、 `poppler` にある `pdftohtml` を実行すると、

“`bash
pdftohtml test.pdf output
I/O Error: Couldn’t open html file ‘outputs.html
“`

原因は、Lambdaではカレントディレクトリにファイルを作成することができないからです。

https://stackoverflow.com/questions/39383465/python-read-only-file-system-error-with-s3-and-lambda-when-opening-a-file-for-re

# 対応策

上記のStackOverflowの記事にも書かれている通り、 `/tmp` に作成するようにしたら良いです。
`subprocess` を使う

元記事を表示

AWS Cognitoでユーザー情報をAWS Lambda(Golang)から取得する方法

# 目的
APIを叩いてきたユーザー名によって変えたいということがありました。
そこで、Cognitoでオーソライズを行っているLambda関数にて、API Gatewayの認証情報をLambda(Golang)の中で取得する方法を調べました。

# 結論

以下のコードでユーザー名を取得できます。

“`go
func handler(ctx context.Context, apiGWEvent events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

ユーザー名取得
diaryGetter := apiGWEvent.RequestContext.Authorizer[“claims”].(map[string]interface{})[“cognito:username”].(string)

/// …略
}
“`

割と途中のコードとかが謎ですので、以下に解説を載せておきます。(これより単純に取得できる方法がありましたらご教授いただけると幸いです。)

# 解説

元記事を表示

AWS SAMテンプレートのサンプルをベースにLambda Authorizerを組み込む

LambdaやDynamoDBを使ったサーバレスアーキテクチャを構築するうえでとても便利なIaaC(Infrastructure as a Code)ツールであるSAM(Serverless Application Model)を使って、Lambda Authorizerを使った認証付きAPIを作成したいと思います。
今回はトークンベースの認証とします。
SAMには、いくつかのテンプレートが用意されています。その中でも最もシンプルなhello-worldテンプレートからスタートしてみます。

“`
sam init
“`

上記のコマンドでプロジェクトの作成を開始します。
今回は、AWS Quick Start Templatesを選び、Zipでデプロイする方式で、ランタイムはnodejs14.x、使用するテンプレートはHello World Exampleとしました。
ちなみに、ここでとってくるSAMのtemplateは、以下のリポジトリからクローンされます。
https://github.com/aws/aws-sam-cli-app-templates

結果として、次のよう

元記事を表示

【BacklogAPIレート制限対応】ユーザーごとのAPIレートの監視をする仕組みを作った

# 背景
**2021年7月末**からBacklog APIに対するレート制限が実装される。

レート制限に関するブログ : https://backlog.com/ja/blog/backlog-api-rate-limit-announcement/

このレート制限は、APIの種類ごと・ユーザー単位・分単位での制限となる。

この対応のために、まずBacklog APIを利用している各サービスでのAPI利用状況を把握し影響箇所を調査する必要がある。

# 方法
「レート制限情報の取得」APIが用意されている。このAPIを利用することで、その時点のAPI利用状況が把握できる。
https://developer.nulab.com/ja/docs/backlog/api/2/get-rate-limit/#

ただし、**得られる情報はAPIのリクエストを送った時点の情報のみ**であり、特定期間内における利用状況を把握するためには、その期間中に**定期的にこのAPIを実行し情報を取得する必要がある**。

そのために、以下の簡易な監視システムを構築した。

## 監視システム
![

元記事を表示

CloudWatchLogsの特定の文字列を含むログをSlackに転送する -前編-

#完成例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/a4a5dcca-81c0-1b7e-3bef-4e6a6a21c8a5.png)

#slack apiにアクセスしてアプリを作成
botの作成の仕方やslackへのメッセージ投稿の仕方は以下の記事で紹介しています。

https://qiita.com/ms2geki/items/f63757edf705dc5df537

#Pythonのコードのディレクトリ構造

ディレクトリ構造は以下のようになっています

“`shell:ディレクトリ構造
sendLogToSlack
├── lambda_function.py
├── postslack.py
└── slack_sdk
“`

#slack_sdkのインストール
slack_sdkはlambdaの標準モジュールではないので、
pipでインストールしてからzipでパッケージ化する必要があります。

“`bash:slack_sdkをパッケー

元記事を表示

njsでAPIGatewayっぽいものを作ってローカルでLambdaを動かしてみる

そもそもnjsとはなんぞや?という感じですが、簡単に言うとNginxをJavaScriptで制御できるようにするためのモジュールです。
njsだけでなくメジャーなものでLuaというスクリプト言語があり、そちらの方が歴史も古く、nginxに対する制御も色々できるようですが、新しい構文を覚えるのが面倒だったので選択しませんでした。
njs自体の初出がここ最近ということもあり、ほとんどネット上に情報がなかったので筆を取りました。
## 経緯とか
個人でNext.jsで開発をしていたのですが、ローカルでLambda関数の実行ができてそのコードをそのままAWSに上げて実行することができた方が楽なのでまずバックエンド側の開発環境を作ろうというところが始まりでした。

まぁ既にDockerイメージにそういう感じのがあるだろうと思って探すと、`amazon/aws-lambda-ruby:2.7`というイメージがありました。

早速使ってみると

“`Bash
curl -XPOST “http://localhost:9000/2015-03-31/functions/function/invoc

元記事を表示

CloudWatchEvents+lambda+boto3でサーバー代を節約する

#目的→サーバー代の節約

http://myhero2.s3-website-us-west-2.amazonaws.com
Angularのチュートリアルを参考に作成したポートフォリオです。
バックエンドでSpringBoot(EC2)とKeyCloak(FARGATE)とMySQLが動いています。
特にFARGATEは個人で運用する分にはサーバ代が高い為、
CloudWatchEvents+lambdaで決まった時間にタスクをストップさせる構成を実装します。

#lambdaの作成と設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/98c2a448-de5b-6d34-f0a6-90dfcb0cfef7.png)

AWS Lambdaのコンソール画面より関数の作成をクリックします。

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

元記事を表示

Amplify CLI + Lambda + TypescriptのローカルモックをVisual Studio Codeでデバッグする

Amplify CLIでLambda(Function)をTypescriptで書くときに、ローカルモックでLambdaを実行してVisual Studio Codeでデバッグする方法です。
(**デバッグする** とは、VSCode上でブレークポイントを止めてステップ実行、といったことを指します。)

* [Mocking and testing – Function mocking setup](https://github.com/aws-amplify/amplify-cli/issues/6894)

### 注意点

Amplify CLI(@aws-amplify/cli)のv4.44.0以降では、シンプルなJavascriptの状態でもデバッグできていません。
ブレークポイントをが止まらないという[Issue](https://github.com/aws-amplify/amplify-cli/issues/6894)が上がっていますが、解決策が見つかっていない状態です。
このため、v4.43.0の環境での確認結果になります。

### Lambdaを追加してJava

元記事を表示

おうちにLambdaが欲しい!

はじめて投稿します、はるかなぎと申します。最近になり本格的にAWSを触り始めたいわばにわか勢です。

## AWS Lambdaってなあに?

AWS Lambdaは、サーバレス型と呼ばれるサービスのひとつで(利用者が)サーバを用意せずに、プログラムを実行できるサービスです。Faas(Function as a Service)と呼ばれる種類のサービスと説明されることもあります。

詳しい内容は、AWS公式の紹介ページを見た方が早いと思います。

[AWS Lambda(イベント発生時にコードを実行)| AWS](https://aws.amazon.com/jp/lambda/)

## ところで、ローカルで動くの?

この手のものを見ると、自宅に環境が欲しくなりますね。調べたところ、[AWS SAM CLI](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)というローカルでテストを行うツールがあるよ

元記事を表示

AWS CloudFormationでLambdaを使用するAPI Gatewayを構築しよう

# はじめに
AWS CloudFormationを利用してLambdaを使用するAPI Gateway構築のテンプレートのサンプルです。
Lambdaは、S3アーティファクトを使用します。

テンプレートの概要が分からない場合は、[はじめてのAWS CloudFormationテンプレートを理解する](https://qiita.com/miyabiz/items/eb7b0fa1675b5199b9b7)を参考にしてください。

コードは[GitHub](https://github.com/miyabiz-room/CloudFormation-Template/tree/apigw-01)にもあります。

今回は、akane というシステムの dev 環境を想定しています。
同じ構成で違う環境を作成する場合は、{環境名}-parameters.jsonを別途作成します。

“`text:ディレクトリ構成
akane (システム)
├── apigw (スタック)
│ ├── apigw.yml (CFnテンプレート)
│ └── dev-parameter

元記事を表示

OTHERカテゴリの最新記事