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

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

ServerlessFrameworkでLambdaからFargateコンテナを呼びだす

Lamdaからboto3でFargateのコンテナを起動する際の手順です。
ググると簡単にできそうなのですが、私はなぜか盛大にハマってかなり時間がかかったので注意点を記載します。

## serverless.ymlの設定

まず、IAMでECSアクセスのポリシーを付与します。

“`serverless.yml
provider:
iamManagedPolicies: # Optional IAM Managed Policies, which allows to include the policies into IAM Role
– arn:aws:iam::aws:policy/AmazonECS_FullAccess
“`

なお、上記のポリシーが付与されていないと以下のようなエラーが出力されます。
翻訳すると「実行が許可されていません。」ということらしいです。

“`
An error occurred (AccessDeniedException) when calling the PutRule operation: User: arn:aws:

元記事を表示

AWS Lambda 新機能「EFS 統合」の検証と、新しいユースケースの開拓

2020/6/16のアップデートで、AWS Lambda から Amazon Elastic File System (EFS) が利用可能になりました。
本記事ではこの EFS との統合機能を検証し、今回のアップデートによって生まれる新しいユースケースとは何かを考えます。

# アップデートの概要
AWS Lambda 関数が Amazon Elastic File System(EFS)をマウントできるようになりました。
これまでの EFS の主たる用途は、複数の EC2 インスタンスで共有するファイルシステムです。
端的に言えば、1つまたは複数の同時実行される Lambda 関数、従来から対応している EC2 と Fargate を跨ってデータ (ファイル) を永続的に保存および共有できるようになります。

# 前提条件 (構成図)
EFS は VPC 内のリソースとなりますので、VPC Lambda である必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21198

元記事を表示

Zoomのクラウドレコーディング完了をAPI, Lambda経由でSlackに通知する

# これは何
zoomのクラウドレコーディング完了を、slackの特定のチャンネルに通知
今回は

– Slack App (Incoming Webhook)
– AWS Lambda(python)
– AWS api gateway
– Zoom App (Outgoing Webhook)

などを使用します。
※練習も兼ねて手順を細かめにメモしています。

▼クラウドレコーディングが終わってしばらくすると通知が来る。それだけ。こっからカスタマイズしていきたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/4d649e2b-805c-603c-412a-a3d118fec9cb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/a9d862d6-63b0-baa0-498f-b95f2eab059d.png)

### 作成のきっかけ
– エ

元記事を表示

AWS Lambda ローカル実行(デバッグ)、デコレータで例外処理統一、引数チェック等 with Python

AWS Lambdaをローカルで実行するサンプルを書きました。Dockerは使いません。

やること
1. 環境変数の読み込み pip install python-dotenv しておくこと
2. lambda_handlerに渡す event引数を記述したJSONファイル読み込み
3. デコレータで例外処理、引数チェックなどを統一する。複数のAWS Lambda関数を使うときに、共通ファイルにデコレータ関数を定義し、各々の関数でlambda_handlerを呼ぶたびにデコレータ関数を呼び出すようにする。そうすると、失敗時にイベント引数をs3等に保存しておけば再処理したり、またはイベント引数の共通チェックを行うという処理を統一できる。

#サンプル
./.env
./.event.json
./lambda_handler.py

.env 環境変数設定用

“`.env:.env
LogLevel=DEBUG
“`

.event.json イベント引数

“`json:.event.json
{
“body” : “{\”key\” : \”valu

元記事を表示

AWS S3バケットからファイルを取得し、Lambdaのローカルに保存する

#ゴール
S3バケットに格納してあるファイルをLambdaのローカル(/tmpディレクトリ)に保存したいと思います。
今回はバケット(MyTestBucket)に保管したファイル(test_file.txt)を使用します。
ランタイムはPython 3.8です。

##ソースコード
“`
import os
import boto3

s3 = boto3.resource(‘s3’)

def lambda_handler(event, context):

bucket = s3.Bucket(‘MyTestBucket’)
bucket.download_file(‘test_file.txt’, ‘/tmp/test_file.txt’)
return os.listdir(‘/tmp/’)
“`

##結果
osモジュールのlistdir関数で、Lambdaの/tmpディレクトリにファイルが保存されているか確認しています。
テスト実行後のコンソールに表示された結果は以下の通りです。
![rapture_20200615181536.png]

元記事を表示

AWS LambdaでFFmpegを使って動画からサムネイルを作成する

S3にアップロードしたMP4からサムネイルを作成する方法を雑にまとめました。

## 手順

### 1. FFmpegをダウンロード
MP4からサムネイルを取得してくれるライブラリを取得する。
コイツが何者かの詳細は調べてみてください。

[公式](https://johnvansickle.com/ffmpeg/)から `ffmpeg-git-amd64-static.tar.xz`(2020年6月時点で最新)をダウンロードする。
ダウンロードしたzipファイルにはいろいろはいっているが、今回は`ffmpeg`という名前のバイナリファイルだけ使う

### 2. Lambdaのコードを書く
適当にLambda用のディレクトリを作る。
そのディレクトリの中で、先程ダウンロードしたFFmpegのzipを解いて、中にある`ffmpeg`という名前のバイナリファイルを以下の改装に配置する。
お次にindex.jsにLambdaで実行したい処理を書く(以下)
*エラーハンドリングとかはしてないので、いい感じに改良して下さい。

“`
.
├── bin
│   └── ffmpeg
└──

元記事を表示

Lambdaでmiddleware実装 Go編

初めてのGoでなれないところも多く悪戦苦闘していますが、共通処理を外に出してメンテナンス性やコード可読性をあげたいと思い、middlewareを実装してみました。

## middleware用のコード

“`golang:middleware.go
package middleware

import (
“github.com/aws/aws-lambda-go/events”
)

type Handler func(events.APIGatewayProxyRequest) (interface{}, error)

func Middleware(next Handler) Handler {
return Handler(func(request events.APIGatewayProxyRequest) (interface{}, error) {
return next(request)
})
}
“`
handlerについての公式ドキュメントはこちら
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg

元記事を表示

DynamoDB Streamsのパラメータをいじって動作を確認する

# はじめに
DynamoDB Streamsは便利そうなのだけど、イマイチ正体が分からないので確認してみた。
Lambdaの仕組みをある程度理解していて、プログラムを書けることを前提とする。

# 参考
## 通知イベント
通知されるイベントの内容を調べてみようとしたら、クラスメソッド先生が既にちゃんと調べていた。
さすが。

【Developers.IO】[DynamoDB Streamで渡されるeventデータの表示タイプごとの内容をまとめてみた](https://dev.classmethod.jp/articles/dynamodb-stream-view-type/)

# 設定方法
設定方法は2種類。

DynamoDB側から設定する方法と、Lambda側でイベントソースを設定する方法。

前者は、以下のような感じで詳細な設定をすることができない。

![キャプチャ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/b8712b3b-d7d7-bb98-3734-c0e475a

元記事を表示

LambdaLayersをLambdaで作る

# はじめに

普段私が`Lambda`を利用する際は、`chalice`を利用して`Lambda`関数の作成とデプロイをしています。

`chalice`は便利なのですが、デプロイ時に毎回`pip install`して必要な`package`を集めているみたいです。
そのため、`pandas`などの重めの`package`を利用している場合は、デプロイに時間がかかります。

そこで、あらかじめ利用する`package`を登録しておく`Lambda`のサービスの`LambdaLayers`を活用します。

## 前提

`LambdaLayers`を作成する際の前提条件などです。

1. `LambdaLayers`は`packages`を`zip`で固めたファイルを利用して、あらかじめ`Lambda`が利用できる状態にすること[参考](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html)
1. `package`の配置などフォルダ構成も決まっている
1. `pandas`などの一部

元記事を表示

オープンデータカタログをポーリングして変換したり蓄積したり通知したりする仕掛け

# オープンデータカタログをポーリングして変換したデータを蓄積したり通知したりする仕掛け

## はじめに
以前、[静岡県オープンデータカタログ(csv)からCOVID-19対策サイトのデータ(json)に変換して取得するAPI](https://qiita.com/w2or3w/items/55ff3159aea0c7a9e096) という記事を書きました。
ここで作ったAPIをLambdaでポーリングして、データの変更があったらS3に蓄積して、情報はDynamoDBにも保存して、変更があったことをSlackに通知する、みたいな仕掛けを作りました。ETLごっこです。
なお、浜松市だけでなく、静岡市のデータも監視対象としました。
※この仕掛けは結局日の目を見ることはありませんでしたが、詳細はあとがきに書こうと思います。

Lambdaの関数コード(Python)はこちらのリポジトリで公開しています。
https://github.com/ww2or3ww/covid19_shizuoka-opendata_notifier

## Lambdaで定期実行する
トリガーを追加する。
![

元記事を表示

【Lambda】毎朝天気を教えてくれるLINEBot!【サーバーレス】

# 前提

– **AWSアカウントを持っている**
– AWSの基礎知識
– Pythonの基礎知識

# 作ったもの

天気を取得し毎朝7時にLINEに通知するbot!
※ 母が「毎朝天気知りたい」と言っていたので作成することにしました。

weather_forecast_LINE_bot.png
※ テスト中の画像

# 技術選定(この記事で学べること)

– 天気を取得し → OpenWeatherMapのAPI
– 毎朝7時に → CloudWatch Events + Lambda
– LINEに通知する → LINE Notify

# いざ、実装

実装上、APIキーやアクセストークンの取得が先になるため、説明の順番が前後します。説明の順番は以下の通りです。

1. OpenWeatherMapの

元記事を表示

ServerlessFramework+TypeScript+serverless-offlineでLambda関数を作る

## 目標
ServerlessFrameworkをローカルで開発する重宝するserverless-offline。
非常に便利なのでこれをTypeScriptでも使用したかったのですが、色々躓いてました。
今回どうにか動いたので備忘録的にその流れを記録しておきます。

## ServerlessFrameworkにてテンプレートをインストール

“`bash
npx sls create -t aws-nodejs-typescript -n lambda-typescript
cd lambda-typescript
yarn
“`

eslintをインストールしますが、自分はグローバルインストールしたeslint-cliから実行します。
(そうした方が楽なので)

“`bash
# まだインストールしていなければ
npm i -g eslint

eslint –init
? How would you like to use ESLint? To check syntax and find problems
? What type of modules does you

元記事を表示

インフラエンジニアがやってみた AWSでサーバーレス Webアプリケーション開発

# はじめに
以下のような構成でサーバーレスアプリケーションの個人開発を行いました。

![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369361/b136655a-21ea-b731-8d8d-aca54b2a4826.png)

様々なハマりどころを乗り越えて、ようやくおおよそ動くようになりました。
解らないことだらけですが、楽しかったです。
AWSを触りたいけど、ハマっちゃって先に進めない方に向けて私がハマったところを残します。

私の技術領域は主にインフラ領域(サーバーエンジニア)ですので、あまり開発の知識はありません。
特にフロントエンドは苦手意識があります。
時代遅れのITインフラを抱えてばかりでしたので、AWSも触ったのは初めてです。
サーバーレス、すごいですね!

全体を通して様々なサイトの情報を参考にさせて頂きました。
実際の手順等の細かな内容については参考URLのほうが俄然優秀ですので、そちらをご参照ください。

# 触った順序
以下の順番で開発を進めました。

* AW

元記事を表示

AWS LambdaでTwitterScraperを使おうとして動かなかったで調べてみた

アイカツ!についてのツイートを毎日収集したいという欲があり、手動でやるのも面倒なのでAWS Lambda上で毎日出力するように自動化を実施したいと思っている。

まずはAWS Lambda上で、Lambda LayersにTwitterScraperのライブラリ(1.4.0)を登録して、ざっくり動作検証レベルで以下のようなコードを実装してテスト実行してみた。

“`python
from twitterscraper import query_tweets
import datetime as dt

def lambda_handler(event, context):

begin_date = dt.date(2020,6,5)
end_date = dt.date(2020,6,6)
pool_size = (end_date – begin_date).days

tweets = query_tweets(“アイカツ”, begindate = begin_date, enddate = end_date, poolsize

元記事を表示

セキュリティグループのマイIPを自動更新してみた(ただしバッチファイルで)

セキュリティグループのインバウンドルールのソースに「マイIP」を指定できることは有名ですが、このマイIPってグローバルIPが変わるたびに手動で設定しなおさないといけないんですよね。これの更新を自動化できないものか、と考えていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/b99f10d4-9e3c-64a9-37d5-066acac9c9f6.png)

ググると`http://checkip.amazonaws.com/`にGETリクエストを投げるとグローバルIPが取得できるので、そのIPアドレスをインバウンドルールのソースに設定する(というスクリプトを作る)。というのが定石のようでしたが、なんかこのURLで得られるIPアドレスと、マネージメントコンソール上で表示されるマイIPが異なっており、`checkip.amazonaws.com`は使えませんでした。実際、`checkip.amazonaws.com`から取得したIPをセキュリティグループのインバウンドルー

元記事を表示

EC2インスタンスの自動停止をLambda+CloudWatch Eventsで実現する

ググれば似たようなコードはあると思いますが、忘備録として残しています。

AWS Instance Schedulerを利用したり、タグに時間を設定しLambdaの定期実行でその時間が来れば停止するといったコードはよく見かけたのですが、コストを最大に下げるためにLambda実行回数も減らしたかったので、時間固定を前提としました。

# やりたいこと
EC2インスタンスのタグで下記のように設定したインスタンスの自動停止を平日21時に実行したい。

– Name: `auto-stop`
– Value: `true`

# 手順
## IAMロール・ポリシーの作成
こういうポリシーを持つIAMロールを作っておく

“`json

{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“ec2:DescribeInstances”,
“ec2:Stop

元記事を表示

AWSラムダを全く理解していない人間が練習

###あくまで備忘録です
#やりたいことだけ明確に
###まず、目標
※この部分を書いている時点で一切の作業をしていません
AWSのラムダを使うとしてお金がかかるので、ローカル(Windows環境)にダウンロードできるものだけでラムダを作りたい。
htmlで書いた(ここの言語は未定)Webサイトにアクセスし、Pythonの書かれたラムダに投げて帰ってきたデータでhtmlを更新する、なんて形を取れればいいと思っている。
~~静的なWebサイトを作るのであればS3でもいいとか言ってはいけない~~

#何をダウンロードしよう
ググったところ[[参考:A]](https://dev.classmethod.jp/articles/invoke-aws-lambda-python-locally/)のサイトを見つけたので内容を確認。**python-lambda-local**というものを使えばいいらしいので早速インストール

cmdからpipでダウンロード~~pipがナニか変わらなかった無知な自分は[こちら](https://techacademy.jp/magazine/21161)~~

元記事を表示

AWS AppSync Nuxtjs

# 概要
AppSyncを使ってみたかったので、簡単なツイートシステムを作って見ました。
今回はAppSyncの仕組みやLambdaとの連携を理解したかったので一から構築しています。

## 構成
![AppSync構成 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525769/97e2d417-054d-e2ec-693a-23562d9b87f5.jpeg)
フロントにNuxtjsを置いてappsyncを経由し、LambdaでDynamoDBにデータを保存ようにしてみました。
AppSyncのウィザードを使うと全部自動で作ってくれます。

## AppSyncの設定
1. AWSのAppSyncのページで「APIを作成」をクリック
スクリーンショット 2020-06-03 19.53.04.pngNode.js: Lambda で MariaDB のデータを削除 (Delete)

フォルダー構造

“`text
$ tree -a
.
├── .env
├── function_update.sh
├── index.js
└── test_local.js
“`

“`js:maria_delete/index.js
// —————————————————————
// maria_delete/index.js
//
// Jun/07/2020
//
// —————————————————————
var mysql = require(‘mysql2/promise’)

// —————————————————————
async function main(id_in)
{
console.error(“id_in = ” + id_in)
const host = `${proc

元記事を表示

Node.js: Lambda で MariaDB のデータを更新 (Update)

フォルダー構造

“`text
$ tree -a
.
├── .env
├── function_update.sh
├── index.js
└── test_local.js
“`

“`js:maria_update/index.js
#! /usr/bin/node
// —————————————————————
// maria_update/index.js
//
// Jun/07/2020
//
// —————————————————————
var mysql = require(‘mysql2/promise’)

// —————————————————————
function get_current_date_proc ()
{
const today = new Date ()
var

元記事を表示

OTHERカテゴリの最新記事