- 1. Netlify Functions で古のアクセスカウンター(アクセサリー)をつくる
- 2. コロナウイルス情報をリツイートするbot作成
- 3. SPA(S3+Cloud Front)でLambda@Edgeを使ってTwitterカードを表示する〜コンソールOnly
- 4. Qiitaのいいね数を通知してくれるLINE Botを作ってみた
- 5. AuroraServerlessへcsv形式で一括データ挿入する
- 6. S3, Lambda, MediaConvert を連携してストリーミング配信用動画ファイルへの自動変換フローを作る
- 7. サーバーレスWebアプリにメールフォームを追加実装する 〜 バックエンド編 〜
- 8. Lambda Layersを作成する時はdocker-lambdaやyumdaが便利
- 9. AWS LambdaでCloudWatchLogsをS3に出力する (Pythyon ver)
- 10. Serverless Frameworkで AWS Lambda Layersを作る
- 11. CloudWatch Logs の CreateExportTask でエクスポートされたログのキー名からエクスポートタスク ID 名を削除する方法
- 12. Lambdaに[/tmp]を利用してpythonライブラリをインストール
- 13. AWS Security Hub のセキュリティ標準チェックが自動で有効化される条件
- 14. AWS Lambda + Python + Slack でサイトの監視・アラート通知
- 15. AWS Lambdaの例外処理の仕方(同期実行・非同期実行・ストリームベース実行)
- 16. Lambda FunctionsをCloudFormationでデプロイするbashスクリプト
- 17. Serverless Frameworkのlambdaアプリにカスタムドメインを付与する
- 18. Lambda@Edgeを完全に理解する?♀️
- 19. Laravelのサーバレス用ライブラリbrefを使い、lambdaでhello world
- 20. AppSyncでLambdaを呼び出す
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 osrdsData = 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の作成
サーバーレス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/shexport 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/bashif [ -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は関係ありません。**発行済になったら`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