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

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

Netlify Functions で古のアクセスカウンター(アクセサリー)をつくる

## はじめに

既にホスティングサービスが終了している懐かしの「ジオシティーズ」ですが、[スケジュール上では 2020/3/31 に全ファイルの削除](https://info-geocities.yahoo.co.jp/close/)が行われるようです。

自分にはジオシティーズ上で 2005年くらいまで更新していたサイトがありましたので、FTP でファイルを救出し [Netlify](https://www.netlify.com/) の無料枠にて記念に再ホストすることにしました。

…できたものの何かが足りない。

![2020-03-30_01-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102286/e32bf371-2b95-52ce-2d4e-a342ec90ed19.png)

アクセスカウンターだ!

ということで Netlify に備わる Lambda なサービス Netlify Functions でアクセスカウンターをふとつくってみることにしました。

お気づきのように

元記事を表示

コロナウイルス情報をリツイートするbot作成

# 成果物
日本の公的機関が発信するコロナウイルス関連ツイートを自動でリツイートするTwitterbot

# 背景と目的
コロナウイルスについて日々不安感が増している状態で自分でなにかできることはないか?と考えました。そこで最近twitterAPIを使用するアプリを作成していて、それを活かして正しいコロナウイルス情報を拡散できるのではと。
しかしながら自身もウイルスの知識を持っていないので何を持って正しい情報か判断できないし、ましてや間違っている情報を拡散して混乱させることは不本意なので避けたい。
その中で思いついたのは公的機関である各自治体、省庁が発信するコロナウイルス情報を使用できると考えました。正確性があること、また、公的機関で住民のために働く人が出している情報をもっと知ってもらいたいこと。
そういった思いから公的機関のコロナウイルス情報のツイートをリツイートするbotを作成しました。

# 主な使用技術
– AWS Lambda
– Serverless Framework
– python
– tweepy

元記事を表示

SPA(S3+Cloud Front)でLambda@Edgeを使ってTwitterカードを表示する〜コンソールOnly

Twitterカードに代表されるOGPの実装は、基本的にmetaタグに情報を加えるだけ。
ただ、React等SPAとして実装されたサイトでOGPを実装する場合は一工夫必要。

# OGPの基本的な仕組み
1. ユーザーがSNS(Twitterなど)にリンクを貼る
2. 各SNSのボットがそのURLにアクセスして、metaタグを読みにいく

この時、ボットがJSを実行できないために、
SPAの場合は常にルートのindex.htmlのmetaタグが読み込まれてしまう
=表示される画像などを動的に変更することができない

# 指針
1. CloudFrontのビューワーリクエストにLambda@Edgeを差し込む
2. UserAgentを判定し、botからのアクセスの時だけ、動的にmetaタグを追加したHTMLをレスポンスとして返す

ユーザーがSNSにリンクを貼ってボットがサイトに来たときだけ、表示させたい画像をmetaタグに詰めて渡してあげる
# 実装
## Lambda@Edgeの実装
Lambda@Edgeはus-east1(バージニア北部)リージョンでしか使用できないため、
それ

元記事を表示

Qiitaのいいね数を通知してくれるLINE Botを作ってみた

## 背景

– Qiitaに投稿した記事数が増えてくると1日に何件かいいねがつくようになりそれがモチベーションになってきました
– しかし[通知一覧](https://qiita.com/notifications)画面はいろいろな通知が混ざっていて見やすいものではなく、以前まであった日毎のいいね数のグラフも[先日のアップデート](https://blog.qiita.com/user-page-renewal/)でなくなってしまいました
– なので前日何件のいいねがついたのか知らせてくれるLINE Botを勉強も兼ねて作ってみました
– まだまだ機能を追加したいですが最低限できたので紹介します

## できたもの

– QiitaのIDを登録しておくと前日のいいね数を通知してくれるLINE Bot

![Screenshot_20200329-202656.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/4c984b19-0b02-1988-2cb1-fc0489034b8d.png)

元記事を表示

AuroraServerlessへcsv形式で一括データ挿入する

S3に置いたcsvファイルのデータをAuroraServerlessにdataAPIを介して挿入するlambda。

“`python
import json
import csv
import boto3
import os

rdsData = boto3.client(‘rds-data’)
s3 = boto3.resource(‘s3’)
bucket = s3.Bucket(‘バケット名’)
tableName = “テーブル名”
clusterArn = ‘クラスターARN’
secretArn = ‘シークレットARN’

def lambda_handler(event, context):

# S3からファイル取得
bucket.download_file(‘S3上のファイル名.csv’, ‘/tmp/保存時のファイル名.csv’)

# 最終的にAuroraServerlessに投げるSQL文
allSqlstr = “”

# csv → json変換
with open(‘/tmp/names.csv

元記事を表示

S3, Lambda, MediaConvert を連携してストリーミング配信用動画ファイルへの自動変換フローを作る

# はじめに
本記事では、S3にアップロードした動画ファイルをストリーミング配信用動画ファイル(HLS形式)へ自動変換するフローの作成手順を説明します。AWSのサービスの連携概念図は以下の通りです。
![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431877/90aec567-302d-8efe-ed1b-b48478583df4.png)
今回は同一S3バケット内に元動画アップロード用フォルダ(input folder)と変換後動画用フォルダ(output folder)を作成します。そして、input folderへのアップロードをトリガーとしてLambda、MediaConvertと連携します。

# S3バケットの作成
作業概要
1. S3バケットの作成
2. folderの作成
makeFolder.pngサーバーレスWebアプリにメールフォームを追加実装する 〜 バックエンド編 〜

# サーバーレスWebアプリにメールフォームを追加実装する 〜 バックエンド編 〜
## はじめに
[AWSを活用したサーバーレスWebアプリの制作](https://qiita.com/w2or3w/items/87b57dfdbcf218de91e2)で作ったWebアプリにメールフォームを追加実装します。
2部構成にしていて、先にフロントエンド編から見ると良いと思います。
[サーバーレスWebアプリにメールフォームを追加実装する 〜 フロントエンド編 〜](https://qiita.com/w2or3w/items/b05df2bf49cba13a542e)

## バックエンド
ベースとしたWebアプリはAppSyncを利用していますので、フロントエンドからメールを送るLambdaを呼び出す手段もAppSyncとします。

### Lambda関数の作成
Lambda関数の新規作成時、実行ロールの選択と作成で「Amazon SNS 発行ポリシー」を加えておきます。
![Screenshot 2020-03-29 at 08.53.11.png](https://qiita-im

元記事を表示

Lambda Layersを作成する時はdocker-lambdaやyumdaが便利

## はじめに

docker-lambda のビルドイメージで各ラインタイムバージョンに対応した Layer が作れる!

“`shell-session
$ docker run –rm -v $(pwd):/var/task lambci/lambda:build-python3.8 \
> pip install -r requirements.txt -t python/lib/python3.8/site-packages/
“`

AWS Lambdaで 実行したいソフトウエアパッケージは yumda で Layer 化できる!

“`shell-session
$ docker run –rm -v $(pwd)/git-layer:/lambda/opt lambci/yumda:2 yum install -y “`

## 一からやると環境準備は結構大変
AWS Lambda や Lambda Layers のよくある注意点としてネイティブバイナリの扱いがあります。
Lambda 実行環境は、特定の Amazon Linux 環境と

元記事を表示

AWS LambdaでCloudWatchLogsをS3に出力する (Pythyon ver)

AWS Lambda (ランタイムはPython)を使って、CloudWatchLogsをS3に出力するソースコードを書いてみました。
ちなみに、Lambdaの実行は、手動でするなり、CloudWatchEventで定期的に実行するなり考えられると思います。

## ポイント
### 1. ログ出力のAPIは非同期で動く
boto3の場合、

logs = boto3.client(“logs”)
response = logs.create_export_task(**kwargs)

でログ出力が動きますが、create_export_taskが非同期で実行されるので、処理の終了を確認しないで、次のログ出力を行った場合、エラーになる可能性があります。
なので、複数ログ出力をするときは、必ずログ出力が終了したかを確認するために、

logs.describe_export_tasks(taskId = response[“taskId”])

の処理を挟みましょう。

### 2. 環境変数
環境変数の値は以下の通りです。

| 変数 |値
|—|—
|BUCKET_NA

元記事を表示

Serverless Frameworkで AWS Lambda Layersを作る

#目的
Serverless Frameworkを使って、Lambda関数と同時にLambda Layerを作成する。
#ディレクトリ構成
“`
sls-example
├── handle.py
├── layers
│ └── pillow
│ ├── package.sh
│ └── requirements.txt
└── serverless.yml
“`
“`text:requirements.txt
pillow==6.0.0
“`
“`sh:package.sh
#!/bin/sh

export OUTPUT_DIR=”python”
rm -rf ${OUTPUT_DIR} && mkdir -p ${OUTPUT_DIR}
docker run –rm -v $(pwd):/var/task -w /var/task lambci/lambda:build-python3.6 \
pip install -r requirements.txt -t ${OUTPUT_DIR}
“`
“`

元記事を表示

CloudWatch Logs の CreateExportTask でエクスポートされたログのキー名からエクスポートタスク ID 名を削除する方法

# はじめに

CloudWatch Logs の CreateExportTask API を実行して、CloudWatch Logs のログを S3 へエクスポートする際、以下のようにログのキー名には、ランダムな文字列であるエクスポートタスク ID(CreateExportTask実行時に返却される)が含まれています。

“`
<バケット名>//<エクスポートタスクの ID>/<ログストリーム名>/<ログファイル名>
“`

場合によっては、このエクスポートタスク ID をエクスポートされたログのキー名に含めずにエクスポートしたいことがあると思います。

現状では、このエクスポートタスク ID を含めずにエクスポートすることが出来ないので、エクスポートタスク ID を含めたくない場合は、エクスポート完了後にキー名を変更する必要があります。

しかしながら、毎度手動で変更するのも面倒且つオペレーションミスを誘発しそうなので、Lambda を使用して自動的に変更する方法を紹介したいと思います。

元記事を表示

Lambdaに[/tmp]を利用してpythonライブラリをインストール

#問題
Lambdaのデプロイパッケージのサイズ制限で、250 MB を超えることはできません。
#解決方法
Lambda Layerを作成
Lambdaの[/tmp]フォルダー(512M)を利用してライブラリをインストール
今回は2の方法を説明します。
#requirements.txtファイルを作成
“`text:requirements-lambda.txt
numpy==1.16.3
“`
“`sh:create.sh
#!/bin/bash

if [ -d “deploy” ]; then rm -Rf deploy; fi
mkdir deploy
pip install -r requirements-lambda.txt -t deploy/requirements-lambda/
cd deploy/requirements-lambda
rm -r PIL
rm -r Pillow*
zip -9 -r ../lambda-requirements.zip .
cd ..
rm -r requirements-lambda
“`
#Lambdaにhandl

元記事を表示

AWS Security Hub のセキュリティ標準チェックが自動で有効化される条件

※ 2020/3/25 時点の挙動を元に記載しているため、今後変更される可能性があります

## Security Hubを有効化する方法によって挙動が異なる
AWS CLI や AWS SDK など EnableSecurityHub API を使用して Security Hubを有効化した場合、
CIS AWS Foundations Benchmark のセキュリティ標準チェックも自動で有効化されます。
2020/2/13 から利用可能になった PCI DSS のセキュリティ標準チェックは有効化されないため
利用者が明示的に有効化する必要があります。
以下の API リファレンスにも記載があります。

**AWS Security Hub > API Reference > EnableSecurityHub**
https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_EnableSecurityHub.html

> When you use the EnableSecurityHub operation to

元記事を表示

AWS Lambda + Python + Slack でサイトの監視・アラート通知

運用中のサイトがたまに落ちていることがあったので、
簡易的にですがサイト監視を用意してみました。
(世の中にはサーバーのメトリクス取得含め手厚い監視サービスが様々ありますが、今回は低コストかつSlackとも簡単に連携できる方法という位置づけで作っています)

## サイトのstatusをチェックしてSlackに通知する
では、サイトチェックをするコードを書いていきます。
おおまかな流れとしては、指定されたURLのHTTP statusをチェックし、200以外のサイトがあれば、Slackに通知するというようになっています。
(逆に問題が無ければ、Slackには何も通知されません。テストの際には404ページのURLなどを含めてあげてください。)
全体は以下のようになります。

“`health_checker.py
# -*- coding: utf-8 -*-
import requests
import json

# 監視したいサイトのURLを配列で指定
urls = [‘https://www.rakuten.co.jp/’]

def post_slack_h(c):

元記事を表示

AWS Lambdaの例外処理の仕方(同期実行・非同期実行・ストリームベース実行)

### 前置き
本記事は、AWS Lambda(以下、Lambda)のコード内で起きた例外処理の仕方を書きます。つまり、以下で紹介するものは、Lambdaの起動には成功しているという前提なので、起動自体に失敗しているちう人は、別の記事を参照してください。

### 概要
Lambdaに限らず、例外処理というのはプログラムにつきものです。何等かの不具合で例外が発生させる場合や、意図して例外を発生させる場合があります。
**Lambdaでも同じように例外処理をするわけですが、Lambdaはイベントトリガーによって例外処理の仕方を変える必要があります!** Lambdaのイベントトリガーについては、以下のようなものがあります。

[参考]
AWS Black Belt の AWS Lambda Part1
https://d1.awsstatic.com/webinars/jp/pdf/services/20190402_AWSBlackbelt_AWSLambda%20Part1%262.pdf

以下で Pythonプログラムを用いて、簡単例外処理の仕方を紹介したいともいます。

#

元記事を表示

Lambda FunctionsをCloudFormationでデプロイするbashスクリプト

Lambda FunctionをCloudFormationでデプロイするときの考え方は、やってみて以下がしっくりきました。

> Lambda関数は別ファイルとして保存し、aws cloudformation packageしてaws cloudformation deployする
> ([CloudFormationでAWS Lambdaを作成・更新する際のベストプラクティス](https://qiita.com/kihoair/items/fe204fc8582946646d07))

実際の実施時には、デプロイ後に不要になるS3バケットに置いたソースコードファイルや、中間ファイル的に作成されるテンプレートファイルなどの削除もしているので、それを含めた手順をメモしておきます。またその手順が繰り返し行っているとちょっと手間に思えてきたので、 bash スクリプトにまとめてしまうことにします。

# AWS CLIでのLambda Functionのデプロイ

AWS CLIでLambda Functionをデプロイする手順を確認しておきます(もしスクリプトが使えればいい、動作は分か

元記事を表示

Serverless Frameworkのlambdaアプリにカスタムドメインを付与する

[前回作成したLaravelのサーバレスアプリ](https://qiita.com/umihico/items/64fcf159f68ebd866170)にカスタムドメインでアクセスできるようにします。
ACMで証明書を取得します。Route53経由の方はDNS経由で簡単に取得できます。サブドメインはワイルドカードで申請するのみです。
**Lambda関数がEdgeの場合は、`us-east-1`(バージニア北部)のACMである必要があります。東京のACMは関係ありません。**

スクリーンショット 2020-03-21 10.54.52.png

発行済になったら`serverless-domain-manager`のインストールします。[a4e6e25d](https://github.com/umihi

元記事を表示

Lambda@Edgeを完全に理解する?‍♀️

# 何者だお前は
2017年7月17日に正式リリースされたサービス。
[Lambda@Edge の一般提供を開始](https://aws.amazon.com/jp/about-aws/whats-new/2017/07/lambda-at-edge-now-generally-available/)

>AWS Lambda にコードをアップロードし、Amazon CloudFront イベント (ビューワーリクエスト、ビューワーレスポンス、オリジンリクエスト、オリジンリクエストなど) によってトリガーされるように設定するだけです。関連するリクエストが CloudFront によって受信されると、ビューワーに近い最適な AWS のロケーションに実行のためルーティングされます。次に、Lambda@Edge はコードを実行し、CloudFront のグローバルなネットワーク間のリクエストのボリュームに応じてスケールします。Lambda@Edge により、コードを実行して各個別のリクエストに基づいてウェブページをカスタマイズし、グローバルに実行されるカスタム認証ロジックを作成して、安全な

元記事を表示

Laravelのサーバレス用ライブラリbrefを使い、lambdaでhello world

プロジェクトを作ってから少し手を加えるだけで、Laravelのサーバレス化ができました。
AWS上のデプロイはServerless Frameworkが全てやってくれます。

[本家のドキュメントはこちら](https://bref.sh/docs/frameworks/laravel.html)
[Githubはこちら](https://github.com/umihico/laravel-demo)

“`bash
composer create-project –prefer-dist laravel/laravel laravel-demo #プロジェクト作成
cd laravel-demo
composer require bref/bref #肝のbrefインストール
“`

以下の編集を加えます。[b508b15](https://github.com/umihico/laravel-demo/commit/b508b15edf5d1f0a0a7b51e2360e4f390da3dac1)

“`diff:.env
– SESSION_DRIVER=file
+

元記事を表示

AppSyncでLambdaを呼び出す

# AppSyncでLambdaを呼び出す

## はじめに
先日「[API Gatewayでリクエストして、Lambdaで処理させて、AppSyncで受け取る](https://qiita.com/w2or3w/items/227465969ecbbef21787#lambda%E3%81%AE%E4%BD%9C%E6%88%90)」という記事を書きました。この記事のあとがきにも書いたのですが、フロントエンドからLambdaを実行させるために何の迷いもなくAPI Gatewayを利用していたのですが、どうやらAppSyncでも出来そうだぞということで。

データソースにDynamoDBを指定しているAppSyncへ、LambdaをデータソースとするIFを追加します。

## スキーマへIFの追加
AppSyncのスキーマに、モザイク処理を実行するためのIFを追加します。
AWSコンソール > AppSync > 目的のAPI > スキーマ
MutationへprocessApplyMosaicという関数、そして入出力用のデータ型を定義します。
入出力用のデータ型はAPI Gatewa

元記事を表示

OTHERカテゴリの最新記事