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

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

AWS Lambdaのランタイムサポートポリシーについて、および、廃止が迫った場合の対処法

# TL;DR

知っているようで知らないAWS Lambdaのランタイムポリシー、そして、これまで使っていたランタイムが使えなくなったらどうしよう?

そんな疑問にお答えします。

# 背景

AWS Lambdaは2019/12/22現在、サポートランタイムが12個あり、それらは以下のとおり。これはマネージメントコンソールからいつでも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6088/8db8c6fa-aa3d-e176-d939-662abd683464.png)

### re:Inventで新しいランタイムのサポートがアナウンスされました。

* AWS Lambda now supports Node.js 12
* https://aws.amazon.com/about-aws/whats-new/2019/11/aws-lambda-supports-node-js-12/
* AWS Lambda now supports Java 11

元記事を表示

Python3.7ランタイムのAWS LambdaでC拡張ライブラリを使用したい!

本記事はamazonlinuxでpython3.7を使用したい人、lambda上でpythonのC拡張ライブラリを使用したい人向け。

# 動機
Python3.7ランタイムのlambda上でscrapyを動かそうとしたところ以下のエラーでうまく実行できなかった。

“`
{
“errorMessage”: “Unable to import module ‘spider’: cannot import name ‘etree’ from ‘lxml’ (/var/task/lxml/__init__.py)”,
“errorType”: “Runtime.ImportModuleError”
}
“`

調べたところ、どうやらlxmlライブラリはC言語の拡張を使用しており、そのままではlambdaで使えないとのこと。

諦めればいいものの、Python3にこれから移行していくというタイミングで困ることが多そうなので頑張って解決してみる。

PCはMacを使用。

# とりあえずEC2上で動かす

lambdaはサーバレスといっても裏ではamazonlinuxのサーバ上で動

元記事を表示

SAM+CodeDeployでlambdaへデプロイする。

前回まではCodeDeployを用いてEC2インスタンスへのデプロイを学習しました。
今回はデプロイ対象をlambdaでやってみたいと思います。CodeDeployのアプリケーション作成画面でlambdaを選択できるので同じ要領かと思っていましたが、SAMというやつを一緒に使うみたいです。

[公式チュートリアル](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorial-lambda-sam.html)は普通に分かりやすいです。なので、今回はテンプレートyamlファイルの設定項目をここで指定していきましょう。

_contents_

* AWS SAM
* AWS CloudFormation
* 公式チュートリアル実施時の備忘録/トラブルシューティング
* template.ymlの解読(本題)

# AWS SAM

AWS Serverless Application Model(AWS SAM)は、yaml形式で記述したテンプレートを元にして種々のAWSリソースを用いたアプリケーションを構築

元記事を表示

AI-OCR名刺アプリをLINEとGCPで作ってみた

# はじめに
 名刺の写真をLINEに送ると会社・名前・住所・電話番号がデータベースに登録され組織で共有できるサービスが作りたかったけどたどり着けなかった話です。
~~タイトル詐欺で申し訳ないです。空いた時間で追加開発します。。。~~

 私は現時点(2019.12)でsalesforceのインテグレーションをメインに仕事しているのですが、SFAなので名刺の管理サービスとのインテグレーションが発生しがちです。salesforceとの名刺管理連携では、sansanさんやサンブリッジさんなど有名どころがすでに存在して、非常に簡単にインテグレーションできるのですが、基本的にOCR+人力入力でデータベース化をBPOしているイメージです。
 そんな中、以下の記事を見つけて「え、流行りのGCPを使えば簡単に作れちゃうの?」となり、GCPの勉強をかねてチャレンジしてみました。

◆Vision APIとNatural Language APIを組み合わせて名刺から情報抽出する
https://qiita.com/Hironsan/items/166515acec35658986b2
◆kintone

元記事を表示

SORACOM LTE-Mボタンを押して、Slackのワークフローを発動させる

これは、[SORACOM Advent Calendar 2019](https://qiita.com/advent-calendar/2019/soracom)の21日目の記事です。

**SORACOM FunkとSORACOM Napterは神。**
だと思っている人です。

### 前説
ボタンネタで書こうと思ったものの、何を書くかなーと悩んでました。

そういえば、ボタンを使って承認するって話しあったなー。
承認するといえば、ワークフロー。
そういえば、最近Slackにワークフローできたなー。

よし。ボタン押したら、SORACOM Funk経由で、Lambdaを呼び出して、SlackにPOSTして、ワークフローを起動させよう。

っていうのをやってみた話です。

Funkが使える #しろボタンと#ひげボタン はもちろんですが、
AWS IoT-1ClickからLambdaを呼び出すことができるので、#あのボタン でも使えます。

### 構成図

構成図Lambda+node.jsのREST APIをDocker+Rustに置き換えて高速化したい

## はじめに

– AWS Lambdaをnode.js(javascript/typescript)でよく使っている。
– コスト、またはレスポンス改善のためにLambdaをECS+fargateなどDocker環境に移植したい。
– もちろんRustに移植すれば速くなると思ってやっている。

## Lambdaの問題

– リクエスト課金のため、大規模利用では課金がヤバいことになる。
– レスポンスタイムの揺らぎが大きい、コールドスタートが遅い。
– このどっちの問題にも当てはまらないならLambdaはオススメです。

(最近、Provisioned Concurrencyとか追加されたけど、それでもコールドスタートは発生する)

## なぜRust?

– 速いから。速さがそのままインフラコスト改善になるから。
– C++を長くやってきたけど、最近Rustがいい気がしてきたから。
– でも、現状のLambdaではnode.jsのほうが速いらしい。(node.js、Go、Pythonは同じぐらい)
https://medium.com/the-theam-journey/benc

元記事を表示

終わらないLambda実行

この記事は[AWS LambdaとServerless #1 Advent Calendar 2019
](https://qiita.com/advent-calendar/2019/lambda)の21日目の記事です。

## はじめに

API Gatewayと組み合わせてのAPIサービング、SQSトリガーからのジョブ、DynamoDBの更新をフックにした処理など、いろいろな活躍をしてくれるLambdaですが、API Gatewayからのレスポンスが返ってこないな、テストが終わらない?、という状況になったことはありませんか?

今回は私が開発中に出会った、いろんな意味でLambdaやLambdaを使った処理が終了していない、終了していないように見えるパターンについて紹介します。

1. Postgresへの接続
2. Postgresへ接続したFunctionのテスト
3. DynamoDBトリガーのLambdaでの例外によるリトライ

Serverless FrameworkでNode.js + TypeScriptで検証しています。

## 1. Postgressへの接続

元記事を表示

lambda_handler外のグローバル変数に気をつけよう(datetime)

# はじめに
ジョブが作成されてからLambdaが実行されるまでの間の時間(滞留時間)を取得する
Lambdaを作成していた時に
現在日時を取得するためにdatetimeを使用していたのですが、
そこで「AWS Lambdaは関数インスタンスを再利用」というのに見事にハマったので、
記事にしてみたいと思います。

# 最初に作成していたコード
まずLambdaが実行された現在日時を取得するための
コードを簡略化したものが以下になります。

“`.py
from datetime import datetime

now = datetime.now()

def lambda_handler(event, context):
method_a()

def method_a():
method_b()

def method_b():
method_c()

def method_c():
# xはジョブの作成日時を表しています。
time = now – x
print(data)
“`

– ジョブの作成時刻を`x`
– 現在時刻を`now`

元記事を表示

F# でAWS Lambdaのはじめかた

## Problem

[AWS Lambda が、.NET Core 2.1 ](https://docs.aws.amazon.com/lambda/latest/dg/dotnet-programming-model.html)をサポートされて、1年以上経過しました。
しかし、サポートされているのはC#だけではありません。F#もまた同様です。
F#は.NETで実行される機能言語であり、C#で記述されたAWS SDK for .NETなど、他の.NET言語で記述されたパッケージを使用できます。

これまでに、F#を使用したAWS Lambdaのプロジェクトを作ったことがない方にも分かるように作り方をまとめます。

## Solution

### 開発環境

#### Windowsの場合

開発環境は以下の通りです。

項目|値
—|—
IDE|Visual Studio 2019

#### Macの場合

項目|値
—|—
IDE|Visual Studio Code

### 準備

#### Windowsの場合

##### AWS Toolkit f

元記事を表示

Java リストをイテレートする5つの例から省略形に辿り着く

リストのイテレートについて、シンプルなリストを使って書き方を見ていきます。
今回は以下の文字列のリストを使います。

“`java:list
final List months =
Arrays.asList(“January”, “February”, “March”, “April”, “May”, “June”, “July”, “Augast”, “September”, “October”, “November”, “December”);
“`

これらの要素を順番に標準出力させたいだけです。

### 命令型のスタイル
まずは、for ループを使ってみます。
for ループは命令型のスタイルで、外部イテレータです。
命令型のスタイルでは、「どのように」処理を行うかの多くをプログラマ側で考える必要があります。

#### 1. for ループ(インデックス指定)
特に難しいことはないと思います。1番目の要素から順番に出力しています。
インデックスをわざわざ一つずつインクリメントしながら指定する必要があります。

“`java:for-with-ind

元記事を表示

NimとAWS Lambdaでサーバーレス「大石泉すき」作成の初見RTAをした話

[「大石泉すき」アドベントカレンダー](https://qiita.com/advent-calendar/2019/ohishi-izumi-suki)22日目の記事です。
今回は先日開催された[アイマスハッカソン2019](https://imas.connpass.com/event/151789/)にてサーバーレス「大石泉すき」作成RTAをしたのでその報告をいたします。

## 大石泉と僕
本題へ入る前にまずは私と大石泉の関係についてお話をさせていただこうかと思います。
私は前に[某所で記事にさせて頂いたのですが](https://techdo.mediado.jp/entry/2019/12/06/090000)、NGsのみんなが色々なことを通知してくれるslack botを運用してたりします。

![スクリーンショット 2019-11-28 19.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215879/74e28d83-b4a5-9922-7ebf-da185d6cfb6c.

元記事を表示

Lambda Functionの一覧をランタイムバージョンと共に表示する

古いランタイムバージョンのLambda Functionが残ってると、使ってなくてもAWSからEOL通知のメールが来るので、一覧を表示するスクリプトを書いた。備忘録代わりに投稿します。

“` bash
#!/bin/bash
regions=$(aws ec2 describe-regions | jq -r ‘.Regions[].RegionName’)
for region in $regions
do
aws –region $region lambda list-functions –function-version ALL | jq -r ‘.Functions[] | [.Runtime, .FunctionArn] | @csv’ | sort -V
done
“`

あとは、消したいものをgrepして、“`aws lambda delete-function –function-name ARN“`するだけ。Regionごとに消さないといけないので、ちょっと面倒くさいけど。

元記事を表示

AWS Lambda@Pythonで相対importする

## 実装

`test` というパッケージを作って`lambda_handler`の位置を一階層下げる。

で、起動ハンドラの指定を
`lambda_function.lambda_handler` から
`test.lambda_function.lambda_handler` へ変更する。

### イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299475/a1a7d679-8334-05eb-6005-de897574abb7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299475/d21b8f30-880a-1b09-3b04-4e141fa46376.png)

※ `__init__.py` は必須

元記事を表示

Lambda関数をそのままAWS Batchに乗せ換える(Python3.6限定)

この記事は [アラタナアドベントカレンダー2019](https://qiita.com/advent-calendar/2019/aratana) 19日目の記事です。

Serverlessでサービスを展開していると、どうしてもRDBを使いたくなったり、どこかでバッチ処理をしたくなったりしますよね。

RDBについては、RDS ProxyがLambdaから使用可能になりそうでいい兆しですね。

[Amazon RDS Proxy](https://aws.amazon.com/jp/rds/proxy/)

バッチ処理についてはかつてからAWS Batchというのが用意されています。

これはECRに用意したDockerを使って処理を実行できる環境です。Queueも用意されているのでかなり自由なバッチ設計ができると思います。

さて、Serverlessで環境を構築している場合、まず選択肢として、AWSBatchよりもLambdaを考えると思います。

StepFunctionやQueue、S3などのイベント、並行処理を駆使して構築する場合もあるでしょう。

ただ、Lambdaの実

元記事を表示

Lambda@Edgeについてまとめる

# はじめに
Lambda@Edgeを初めて使い、色々戸惑うことが多かったため調べたことをまとめる。
また、都度追加していく。

# Lambda@Edgeとは
Lambda@EdgeとはCloudFrontの機能の1つで、CloudFrontのエッジサーバでコードを実行するLambda関数のこと。ユーザーに近い場所でコードが実行されることでアプリケーションのパフォーマンスが向上する。
CloudFrontのイベントをトリガーとしてコードを実行する。

## トリガー
上述の通り、CloudFrontのイベントをトリガーとし、イベントがあったCloudFrontと同リージョンで起動する。指定できるCloudFrontのイベントは以下の4つ。

1.ビューワーリクエスト
2.ビューワーレスポンス
3.オリジンリクエスト
4.オリジンレスポンス
スクリーンショット 2019-12-17 19.53.34.pngAWSでサーバレスな定期バッチ環境を作るには結局どれ使えばいいの?(Lambda vs Fargate vs Batch)

LIFULLで技術マネージャーをしています。たまにはエンジニアぽいところを見せてほしいという社内からの~~プレッシャー~~激励に促されて、AWSにおける知見を整理して共有します。

# はじめに
システムを運用する上で、日次や月次の決まったタイミングで動作する定期バッチを必要とするケースがあると思います。定期実行なので、インフラリソースをそのタイミングだけ利用するサーバレスなバッチを作るのが経済的にも地球環境的にも優しいですよね。

ということで、AWSのサービスを利用して実現しようというお話なんですが、選択肢の多さに結局どれを使えばいいんだっけ?ってことになりかねません。そこで考えられる選択肢として [Lambda](https://aws.amazon.com/jp/lambda/)、 [Fargate](https://aws.amazon.com/jp/fargate/)、 [Batch](https://aws.amazon.com/jp/batch/) の3つを取り上げて、定期バッチ環境を作る上でのメリット、デメリットをまとめたいと思います。

# サービス比較
記事投稿時

元記事を表示

究極のCloudFormationをたずねて三千里

AWSの猛者たちよ…完全解をください…!

この記事は、[Fusic Advent Calendar 2019](https://qiita.com/advent-calendar/2019/fusic) 19日目の記事です。

## 究極の機械
こういう機械を見たことはありますか?(画像クリックでYoutubeへ)
[![Claude Shannon Ultimate Machine](http://img.youtube.com/vi/G5rJJgt_5mg/0.jpg)](http://www.youtube.com/watch?v=G5rJJgt_5mg)

結構昔に流行った気もしますが、スイッチを入れると自分で自分のスイッチを切る機械。
これは「役に立たない機械」の一種で、「究極の機械」(Ultimate Machine)と呼ばれるものらしいです(落差が激しい)。

https://ja.wikipedia.org/wiki/%E5%BD%B9%E3%81%AB%E7%AB%8B%E3%81%9F%E3%81%AA%E3%81%84%E6%A9%9F%E6%A2%B0
> 一

元記事を表示

Hello Java Lambda

簡単な要件を満たすコードを書くにあたって、Lambda を使わないケースと使うケースを比較してみます。
以下のような数字のリストを用意し、100以上の分だけ2倍したものを合算する処理を考えてみます。
仕様:100以上の分だけ2倍したものを合算する

“`java:number-list
final List numbers = Arrays.asList(50, 100, 10, 400, 120, 30, 220);
“`

##### Lambda を使用しないケース
たとえば、リスト内の値を一つずつチェックし、もし100以上であればその数値を2倍し、total に加算するという流れが考えられます。
これ位の計算であれば、シンプルで分かりやすく大きな問題はないと思われます。
ただ、仕様(100以上の分だけ2倍したものを合算する)に対して、それを実現する一つの方法として ”数字を一つずつチェックする” というエンジニアのアイデアがそこに挟まれるため、やや誤解を与えやすいコードになる可能性があります。

“`java:without-lambda.java
in

元記事を表示

Lambda + API GatewayでGithub上のアクションを検知してGithubに対してアクションする

# はじめに
最近バックエンドの実装をメインに担当しているエンジニアです。
先日チームメンバー(@sen-higaさん)と共同で行った業務効率化タスクを通して、初めてWebhookやサーバレスアーキテクチャに触れたので、その時の備忘録です。

# やったこと
Github上のアクションを検知してGithubに対してアクションするという仕組みをLambda + API Gatewayで実装しました。
GithubからGithubへの動線がわかりやすいように、タスクの実装時とは内容を変えて、イシューがOpenされた時に、作成者をイシューに自動アサインするというシンプルな仕組みにしました。

スクリーンショット 2019-12-19 8.56.08.png

もっとこうした方がいい、自分ならこう実装するというご意見があ

元記事を表示

LINEで送られてきた写真をS3に保存したい

#何に使うのか
AWSのLambdaなどを用いて画像加工する時やAWS.rekognitionのリソースとして使う時に
役に立てばと思います。
今回、LINE Developperの設定などは飛ばします。

類似の検索をするとSDKを使用している方が多いですが、今回は使わずにいきたいと思います。

##使用技術
– LINE Messaging API
– Python 3.7
– AWS S3
– AWS Lambda

##プログラム
メイン関数一部

“`python:lambda_function.py
import requests
import os
import json
import boto3
from io import BytesIO
#Headerの生成
HEADER = {
‘Content-type’:
‘application/json’,
‘Authorization’:
‘Bearer ‘ +’チャンネルアクセストークン’
}
#main
def lambda_handler(event, context):

元記事を表示

OTHERカテゴリの最新記事