- 1. Lambda Layersを作成する時はdocker-lambdaやyumdaが便利
- 2. AWS LambdaでCloudWatchLogsをS3に出力する (Pythyon ver)
- 3. Serverless Frameworkで AWS Lambda Layersを作る
- 4. CloudWatch Logs の CreateExportTask でエクスポートされたログのキー名からエクスポートタスク ID 名を削除する方法
- 5. Lambdaに[/tmp]を利用してpythonライブラリをインストール
- 6. AWS Security Hub のセキュリティ標準チェックが自動で有効化される条件
- 7. AWS Lambda + Python + Slack でサイトの監視・アラート通知
- 8. AWS Lambdaの例外処理の仕方(同期実行・非同期実行・ストリームベース実行)
- 9. Lambda FunctionsをCloudFormationでデプロイするbashスクリプト
- 10. Serverless Frameworkのlambdaアプリにカスタムドメインを付与する
- 11. Lambda@Edgeを完全に理解する?♀️
- 12. Laravelのサーバレス用ライブラリbrefを使い、lambdaでhello world
- 13. AppSyncでLambdaを呼び出す
- 14. GPSマルチユニットSORACOM Edition 使ってみて、だいたい1ヶ月経ちました。
- 15. API Gateway-lambda DBメンテナンス時はどうする?
- 16. NestJSで特定のサービスのメソッドを直接実行する
- 17. AWS Lambdaのカスタムランタイムを開発する際、失敗したこと
- 18. node.js @line/bot-sdk を使ってAWS lambdaからLINE Messaging APIのpushMessageを使用する時に1時間位右往左往した時の話
- 19. Windows10ProでAWS SAMを使ってローカルでHelloWorld(サンプルはnode.js)
- 20. [fondesk用bot]SlashCommandで表記ゆれに抗う
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]フォルダーを利用してライブラリをインストール
今回は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にhandleプログラム
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
GPSマルチユニットSORACOM Edition 使ってみて、だいたい1ヶ月経ちました。
ソラコムTシャツ欲しいけど、これじゃ貰えないなーって思っている人です。
—
[GPSマルチユニットSORACOM Edition 使ってみた(開封の儀)](https://qiita.com/keni_w/items/f8e78812298093aab9b4)の続きです。GPSマルチユニット SORACOM Edition購入して、約1ヶ月経ちました。
とりあえず行ったことは、**SORACOM Laggon**による可視化、***SORACOM Funk***経由で、AWS LambdaでSlack通知の2つです。### Lagoonによる可視化
とりあえず、オフィスの気温、湿度の可視化をしてます。
とりあえず、平日の10時から19時までの15分置きに加速度を除くデータを送信させてます
API Gateway-lambda DBメンテナンス時はどうする?
下記の構成で、DBサーバをメンテナンスする場合にどうすればよいか?
APIの戻りとしては、エラーではなくメンテナンスのJSONを返却したい。。
--------------------------------
API Gateway → lambda → EC2にインストールした自前のDBサーバ
--------------------------------##考えたこと
API Gatewayでスケジューラでメンテナンスの期間を設定できたら便利だなーと。
その時間になったら設定したメンテナンス用のJSONが返却される。とはいえ、今はないのでどうすればよいか?
考えた方法
APIGatewayのリソースポリシーでAPIへのアクセスをすべて遮断。
アクセス拒否時のゲートウェイレスポンスのJSONをメンテナンス用に変更
そして、デプロイでその後、メンテナンスを終わらせてから、もとに戻す。
こんなところでしょうかねぇ。
以上です。
NestJSで特定のサービスのメソッドを直接実行する
NestJSをLambdaでホストしているとき、特定のサービスのメソッドをダイレクトに実行したい場合があります。
例:cronジョブをCloudWatch Event -> Lambdaで実行する
そういう時はこんな感じのhandlerを作ればOKです。
“`typescript
import {
NestFactory
} from ‘@nestjs/core’
import { Handler } from ‘aws-lambda’// 実行したいサービスのあるモジュール
import {
SiteModule
} from ‘./site.module’// 実行したいサービス
import {
SiteService
} from ‘./site.service’export const handler: Handler = async (event) => {
// Create NestJS application
const app = await NestFactory.create(SiteModule)
AWS Lambdaのカスタムランタイムを開発する際、失敗したこと
# 概要
とある作業にてAWS lambdaで今度はperlを動かすことになりました。
その際、perlのライブラリ`/usr/share/perl5`などが見えなかったり、コマンドが実行できなかったりしたので、いろいろ調べたことをメモしておきます。~~用意されているランタイム使えば余計な苦労しないのにね~~
# 結論
さっさと結論だけ記載すると、以下の環境のカーネルとlibcなどの基本的なライブラリが乗っているものになります。
– Amazon Linux
– イメージ – amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2
– Linux カーネル – 4.14.154-99.181.amzn1.x86_64
– ami-00a5245b4816c38e6注意点として、このイメージは、EC2インスタンスを作るときに、クイックスタートとして表示される、Amazon Linuxのイメージとは別物ということです。
– Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Typ
node.js @line/bot-sdk を使ってAWS lambdaからLINE Messaging APIのpushMessageを使用する時に1時間位右往左往した時の話
https://developers.line.biz/en/reference/messaging-api/#send-push-message
にて“`
const line = require(‘@line/bot-sdk’);const client = new line.Client({
channelAccessToken: ‘‘
});const message = {
type: ‘text’,
text: ‘Hello World!’
};client.pushMessage(‘
‘, message)
.then(() => {
…
})
.catch((err) => {
// error handling
});
“`でいけよ、
みたいに書かれていたので、
自分のパソコンからこれを適宜当てはめたら、
普通にpush出来たので、意気揚々とAWS lambdaで使用したら、
なんかエラー出ていた。connectionが確立されてないよ、
と
Windows10ProでAWS SAMを使ってローカルでHelloWorld(サンプルはnode.js)
# 初めに
Windows10ProでAWS SAMを使ってHelloWorldしようと思ったら意外と大変だったので自分用メモ。
何も入っていない前提ですが、Dockerやnode等が入っている場合は飛ばしてください(特にこだわりがなければこの機会にすべて最新化をおススメします)#### この記事ですること
– node.jsを使ってローカルでHelloWorldする
#### この記事でしないこと
– AWS上にソースをアップロードする
– node.js以外を使ってHelloWorldする# 執筆時の各バージョン
#### GitBash
v2.25.1#### Docker
v2.2.0.4#### node.js
v12.16.1#### aws sam
v0.45.0# 必要なものインストール/設定
### Git for Windowsインストール
[Git for Windows公式](https://gitforwindows.org/)からダウンロードし、インストールする。
(特にチェック付けなくて大丈夫です)### Dockerの
[fondesk用bot]SlashCommandで表記ゆれに抗う
# はじめに
皆さんリモートワークしていますか?慣れてきましたか?
[前回の記事](https://qiita.com/myonoym/items/0541c0e74e0006a71870)で弊社が[fondesk](https://www.fondesk.jp/)を導入し、メンションをつけてくれるbotを開発しましたよというお話をしました。(無事にfondeskは正式採用されたようです。)今回は、メンションをつけるために必要になる、表記ゆれ対策用の辞書を更新するSlash Commandを開発した話です。
# 関連ツール&技術
今回紹介する機能の関連項目です。– Slack
– AWS
– API Gateway
– Lambda
– S3
– Serverless Framework
– Python3.7# 事の発端
前回紹介のbotを導入してから、良い感じにメンションがついているのを喜んでいたのですが、(見ないふりをしていた)事態が勃発しました。そう、表記ゆれです。。田が「た」なのか「だ」なのか、漢字で投稿されるのかカタカナで投稿されるのか等々…少