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

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

AWS Lambda with EFS で MeCab, NEologd & CaboCha を動かす (2020年7月時点)

# はじめに
過去に以下のような記事を書きました。
[AWS Lambda で MeCab を動かす (2018年9月時点)](https://qiita.com/rtaguchi/items/e6cb594196fa8186e9a2)

この記事で最後に
>「Neologdも入れたかったけれども、Lambdaのtemp領域の制限でアウト。
>(中略)
> そうこう言っている間にLambdaのtemp領域の制限が一気に3GBくらいになってくれないかな。

と書いて終わりました。それから約2年。Lambda の temp 領域制限は変わりませんが、代わりに(?)Lambda から EFS にアクセスできるようになりました。これでようやく念願の NEologd を手軽に Lambda 上で動かせるようになりましたので、その方法をまとめます。

まぁ、ホントに EFS に MeCab と NEologd を突っ込むだけなので特別なことはしていません。

# NEologdとは
正式には`mecab-ipadic-NEologd`という名称で、多数のWeb上の言語資源から得た新語を追加すること

元記事を表示

【サーバーレス初心者向け】Serverless Framework + SwaggerでWeb APIを作る!第1回(全3回)

# はじめに
こんにちは!
最近、仕事で初めてサーバーレスアプリを作る機会がありました。その際Serverless Frameworkを使ったのですが、結構お手軽にアプリを作ることができたので、初めてサーバーレスをする方にお勧めだと思いました。今回は自分の整理も兼ねてその手順を記事として残したいと思います。
今回はSwaggerをAPI Gatewayのテンプレートの一部として組み込む方法もご紹介したいと思います。
全部で記事が三つと長いですが、サーバーレスが初めての方でもAPIを構築できるように書きましたので、最後までご覧いただけたら嬉しいです。

# 今回作るもの
今回は以下のアーキテクト図のようなWeb APIバックエンドを作っていきます。
API GatewayでクライアントからのAPIリクエストを受信し、該当するLambda関数を呼び出し、必要に応じてDynamoDBからのデータ読み出しおよび書き込みを行います。さらに、WAFを適用することでセキュアにします。

![slsTestAppArchitect.png](https://qiita-image-store.s3.a

元記事を表示

Lambda(node.js)とJavaScriptのタイムゾーン

Lambda(node.js)で日付の計算をしたら思ったより面倒だったのでまとめる。

# やりたかったこと

日本標準時(JST)で先週/先月の範囲を、世界標準時(UTC)で取得したい。
例えば、今日が 2020-07-29 とすると先週の範囲は日曜日始まりでこんな感じ。

| タイムゾーン | 開始 | 終了 |
|:-:|:–|:–|
| JST | 2020-07-19T00:00:00+0900 | 2020-07-26T00:00:00+0900 |
| UTC | 2020-07-18T15:00:00Z | 2020-07-25T15:00:00Z |

# やりたくなかったこと

大した処理じゃないので余計なライブラリは使いたくない。

# 結論

– タイムゾーンの設定はそのままにプログラム内で対応する
– タイムゾーンオフセット値からJSTを自力で設定する
– UTCへの変換も自力でやる

# それぞれのタイムゾーン

## Lambdaのタイムゾーン

UTCに固定されている模様。

ググるとTZ環境変数を設定すればいいという記事が大量にヒットする。
ただ、

元記事を表示

Serverless Frameworkを使ってsqs+lambda

# はじめに
仕事でsqs+lambdaを使って非同期処理を実装したので、復習がてら記事にしています。
本当は、 DLQを設定してDLQに入るとCloudWatchからslackに通知を飛ばすという風にしたかったのですが、上手くいかなかったので、追記するか別記事にしようと思います。

# Serverless Frameworkからプロジェクトの作成
まず、Serverless Frameworkをインストールします。

“`
@ueMac [~/dev]
[ueyuki]-> npm install -g serverless

@ueMac [~/dev]
[ueyuki]-> serverless -v
Framework Core: 1.74.1
Plugin: 3.6.15
SDK: 2.3.1
Components: 2.31.11
“`

Serverless Frameworkでは、テンプレートを使用してプロジェクトを作成することができます。
今回は、lambdaでgoを使っていくので、goのテンプレートを使用します。

“`
@ueMac [~/dev]
[ue

元記事を表示

逆引き Serverless Framework events for AWS

最近、既存の lambda を全て Serverless Framework を使って置き換えました。
Lambda は色んな event をトリガーにできるのですが記述方法を毎度ど忘れしてしまい、調べ直すことがあったのでメモを残します。もちろんこれで網羅しているわけではないので気づいたことあればご指摘ください。

# serverless.yml
ざっくりと基本構成について。

以下のように外部ファイルに値を定義している方法についてはこちらを参照
`${file(../variables-${self:provider.stage}.yml), file(../variables-dev.yml)}`
[Serverless Framework + Kotlin + Gradle で Lambda をデプロイする – Qiita](https://qiita.com/Nabesuke/items/40139ee441a33cb1dcf2#custom)

“`serverless.yml
service: my-service # サービス名

provider: # 各fun

元記事を表示

AWSを利用した会員サイトをサーバーレスで実装しました

AWSを利用した会員サイトをサーバーレスで実装しました。
始めはCognitoとS3でなんとかなるだろうと思っていましたが、
いざやってみるとどうにも思い通りにならず、四苦八苦しました。

調べてみると、どうやらCognitoとS3だけでは、S3に対して**ユーザー単位のコンテンツ**にしかアクセスできず、**ユーザー共有のコンテンツ**にはアクセスできないみたいです。(私の調査不足/理解不足かもしれませんが…)

というわけで、以下のAWSの機能を利用して実装してみました。

* S3
* CloudFront
* Cognito
* API Gateway
* Lambda

## 処理手順
1. S3に公開フォルダと会員限定フォルダを作成する。
1. S3に対してはCloudFrontを通してアクセスする。
1. S3の会員限定フォルダへは、**CloudFrontの閲覧者のアクセスを制限する機能**のCookieを使用する。
1. Cognitoで認証が成功した場合、認証情報のJWTトークンをAPI Gatewayのオーソライザーで検証する。
1. API Gatewayの

元記事を表示

SwaggerでLambdaのデバッグ環境を作る(7):AWS S3トリガをデバッグする

久しぶりの、SwaggerでLambdaのデバッグ環境を作る の拡張です。
 第一回の投稿はこちらから:[SwaggerでLambdaのデバッグ環境を作る(1)](https://qiita.com/poruruba/items/e3a46787c79517a815f9)

AWS S3にファイルがアップロードされたときにLambdaを起動するスクリプトを書こうと思っても、Lambda上でのデバッグは大変なので、ローカルでデバッグ(実行中のブレイクを入れたり、変数を参照したり)できるようにします。

S3は、本物ではなく、S3互換のMinIOを使います。

今回のローカルデバッグ環境は以下のGitHubに反映済みです。

poruruba/swagger_template
 https://github.com/poruruba/swagger_template

#MinIOのセットアップ

ほぼこちらに書いてある通りに進めます。

MinIO Quickstart Guide
 https://docs.min.io/

今回は、Distributed MinIO Quicksta

元記事を表示

Slack から KING OF TIME に打刻する社内ツールで Rust 入門しました

とりあえず [The Book](https://doc.rust-lang.org/book/) やってたんですが、座学続けられないタイプなもので 12 章あたりで疲れてしまったので、
もう書いてみるかということで、もともと TypeScript で書いて AWS Lambda で動かしている Slack [Slash Commands](https://api.slack.com/interactivity/slash-commands) で会社の勤怠管理システム [KING OF TIME](https://www.kingtime.jp/) に打刻するプログラムをリプレースしてみました。

## インストールしておくもの
– [Rust](https://www.rust-lang.org/)
– [musl-cross](https://github.com/FiloSottile/homebrew-musl-cross)
– [AWS CLI](https://aws.amazon.com/jp/cli/)

## とりあえず AWS のドキュメントを参考に Lambda

元記事を表示

AWSハンズオン実践メモ 〜AWS Lambda と AWS AI Services を組み合わせて作る音声文字起こし & 感情分析パイプライン〜

# はじめに

AWS公式の[ハンズオンシリーズ](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/?trk=aws_blog)の中から、AWS Lambda と AWS の各種 AI サービスを組み合わせて、**“音声ファイルがアップロードされると文字起こしと感情分析を自動的に行う”** パイプラインを構築する[ハンズオン](https://pages.awscloud.com/event_JAPAN_Ondemand_Hands-on-for-Beginners-Serverless-3_LP.html?trk=aws_introduction_page)を実施しました。

本記事は自身のハンズオン学習メモとして投稿します。
# 目次
– [ハンズオンの目的](#ハンズオンの目的)
– [本編](#本編)
– [おわりに](#おわりに)

# ハンズオンの目的

– 音声の文字起こし、およびその感情分析を行うパイプラインをサーバーレスアーキテクチャで構築する
– S3トリガーでLambdaを

元記事を表示

基本的なREST-APIをAWSのAPI GatewayとLambdaとDynamoDBで作るための参考サイトまとめ

ゼロからAWSでREST-APIを一気通貫で実装してみましたが、それなりの苦労があったため、次はもっと効率よく作りたいので、参考サイトをまとめておきたいと思います。

# やってみたこと
超シンプルなREST-APIを作ってみました。シンプルですがいろいろ知る必要がありました。

+ 一覧は、GETでパスパラメータがあり、パーテーションキーだけ渡す、レスポンスはJSONでBODYが配列
+ 追加は、POSTでパスパラメータがあり、パーテーションキーだけ渡す、リクエスト本文はJSON、レスポンスもJSONでBODYが1件、ソートキーが採番される
+ 更新は、PATCHでパスパラメータがある、パーテーションキー、ソートキーを渡す、リクエスト本文はJSON、レスポンスもJSONでBODYが1件
+ 検索は、GETでパスパラメータがある、パーテーションキー、ソートキーを渡す、リクエスト本文はなし、レスポンスはJSONでBODYが1件
+ 削除は、DELETEでパスパラメータがある、パーテーションキー、ソートキーを渡す、リクエスト本文はなし、レスポンスはJSONでBODYが0件

# 参考サイ

元記事を表示

Lambda+SAMテンプレートのBlue/Greenデプロイメントで「デプロイの再試行」した際の動作を検証する

# はじめに
デプロイ運用は、Blue/Greenでシームレスにサービス移行できるのも重要だが、デプロイに失敗した際のロールバックと再デプロイをスムースに行えることも重要だ。

Canaryなデプロイにおける自動ロールバックについては、[過去の記事](https://qiita.com/neruneruo/items/2e7bf289f375ccc91356)で調査を行ったので、今回は手動ロールバックと再デプロイについての動作検証を行う。

なお、最初に断っておくと、この方法は結果的に期待した動作になっているが、途中でエラーが出たりして怪しさ満点である。もう少しちゃんとした検証が必要かもしれない。

# 前提条件
– Lambda+SAMテンプレートでの基本的な動作の仕様を理解している([過去の記事](https://qiita.com/neruneruo/items/73906cdc3c2aa699644f)で紹介済み)
– デプロイは以下の仕様とする
– Prodのエイリアスを使用してCanaryの向き先を制御する(SAMテンプレートで“`AutoPublishAlias: P

元記事を表示

Python + Selenium Chromedirverとserverless-chromeの相性問題

# 環境
AWS SAM + Python 3.7
AWS LambdaのAmazon Linuxコンテナ上で動作。

# 動作を確認できた組み合わせ
“`
serverless-chrome 1.0.0.37 + Chromedriver 2.37 + Selenium 3.141.0
“`

`chrome_options` ではなく `oputions` にセット。

“`python:
from selenium import webdriver
from datetime import datetime

CHROME_DRIVER_PATH = “/opt/python/bin/chromedriver”
HEADLESS_CHROMIUM_PATH = “/opt/python/bin/headless-chromium”

def lambda_handler(event, context):
options = webdriver.ChromeOptions()
options.binary_location = HEADLESS_CHROMIU

元記事を表示

[Next.js/Vercel]LambdaとDynamoDBでJamstackなアプリを作ってみた

## 概要

– 以前にQiitaの前日のいいね数を通知してくれるLINE Botを作りました
– [Qiitaのいいね数を通知してくれるLINE Botを作ってみた](https://qiita.com/ozaki25/items/03b834de8c0c175d955d)
– この延長でいいね数の推移をグラフで表示するWebページを作ってみたというのが今回の内容です
– せっかくなので技術検証も兼ねてJamstackな構成で作ってみました
– 前述の記事の通りデータはDynamoDBにデータを蓄積しているのでHeadlessCMSなどは使わずにチャレンジしてみます

## 作ったもの

– 直近1週間のいいね数をグラフで表示するWebアプリをLIFFアプリとして表示しています

![Screenshot_20200726-014511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/a656b608-38c1-afa4-52ac-1428c92e63a8.png)

元記事を表示

serverlessを使ってLambdaにmultipart/form-dataでバイナリデータをアップロードする

serverlessを使ってLambdaをデプロイする際、Lambda統合の時にバイナリデータをどうやって送るのか地味にハマったのでメモとして残しておきます。
(たぶんうちの若い子達がココ見るはず..)

serverless便利ですね。コマンド一発でデプロイから各種AWSリソースをいい感じにセットアップしてくれます。いらなくなったら同じくコマンド一発でまるっと削除してくれます。これを使わない手はないですね。

## TL;DR
– serverless.ymlのcustomキー配下にapiBinaryでバイナリメディアタイプを指定する
– serverless.ymlのpluginsキー配下にserverless-apigw-binaryを追加する
– Lambdaに送られてくるリクエストはbase64エンコードされたmultipart/form-dataなのでデコードしてaws-lambda-multipart-parserでマルチパートデータをバイナリにする

“`serverless.yml
custom:
…省略
apigwBinary:
types:

元記事を表示

Golangはじめて物語(第3話: CodePipeline+SAM+LambdaでCI/CD編)

# はじめに
[前回](https://qiita.com/neruneruo/items/fe292262836ac068e2ea)というか[第一話](https://qiita.com/neruneruo/items/1ef52f908e4497103a59)の続編。
第一話ではServerless Frameworkを使ったが、今回はCodePipelineを使って自動起動するパイプラインを使ってみようと思う。となると、セオリー(だと思ってるの)はSAMをCloudFormationで起動するパターンだろう。

golangのアプリケーションそのものの話は薄めというか、ほぼ入っていないのであしからず。

# 前提条件
・golangのアプリケーションは[第一話](https://qiita.com/neruneruo/items/1ef52f908e4497103a59)のものをほぼ流用するので、読んでいる前提
・[別の記事](https://qiita.com/neruneruo/items/e2e4fd70c90e2dbdc67f)で書いたTerraformのサブモジュールを

元記事を表示

Jamstack構成メディアのプレビュー機能を、サーバレスAPIを使って実装した

社内で運用するオウンドメディア開発にあたり、Jamstack構成でのプレビュー機能の開発で得た知見などをまとめておきます。構成はNext.js + Contentfulで、ホスティングサービスはAmplify Consoleを使っていますが、上記スタックに特有の機能を使ったとかではないので、他の構成でも使えるかと思います。

## 最初にざっくりまとめ

– プレビューデータを取得するためのAPIをサーバレス構成で作成した
– APIはAPI Gateway + Lambdaで作成し、リソース構築にはServerless Frameworkを利用した
– APIの認可処理にはCognitoを利用した

## Jamstackでのプレビュー機能の設計検討

ブログやオウンドメディアをJamstack構成で構築する際、基本的に各ページは事前ビルドしておき静的ページとして配信するSSGをベースに開発することになると思います。

ただ、執筆中の記事を確認する機能であるプレビュー機能については、SSGでは不可能ではないもののいまいち使い勝手が悪いものになりがちです。プレビューを確認するたびにアプ

元記事を表示

LambdaとDjangoの相性ってどうなの??

# 忙しい人へ
結論とまとめを最初にのせときます

## 結論
Djangoのようなフルスタックフレームワークではあまり良いとは言えない
フルスタックフレームワーク使うならECSを使った方が良いらしい

## まとめ
> Lambdaのコールドスタートで時間かかるのでは?

結構かかります

> DjangoのプロジェクトをLambdaにアップロードしたら、Lambdaのアップロードサイズ制限に引っかかるのでは?

かかる可能性はあります
ただよほど入れなければ大丈夫なはず

> REST APIを作る時に、DjangoのルーティングとAPI Gatewayの組み合わせって相性悪くね?

実害はないと思うけど悪いと思います

> Django使うってことはサーバーレスなのにサーバー立ち上げるってこと?

その通りです

# 前置き
この記事はあくまでも私見です
これが絶対正しいということではないのでご了承ください

# 前提
zappaというデプロイツールを用いての検証

# 本題
LambdaとDjangoの組み合わせにした時の疑問点がいくつかあった
その疑問点をひとつづ

元記事を表示

Gitのサブモジュール機能とTerraformのモジュール機能で実現するCI/CDパイプラインの量産(Lambda編)

# はじめに
Terraformのモジュール機能は最初はありがたみを感じられなかったので使わなかったものの、CI/CDパイプラインをいろいろと量産するようになってくると、いちいち過去のtfファイルを流用しようとして「どれが最新だったっけ……」と悩むようになったので、そろそろリポジトリ管理をするべきなのでは、と考えていた。

そんな折、Gitのサブモジュール機能を知って「これってもしかして組み合わせれば「おれの考えた最強量産型CI/CDパイプラインができるのでは?」と思い、作ってみた。

# 全体構成
今回は以下のような構成だ。

“`メインモジュール
terraform-mainmodule-lambdapipeline
├── .gitmodules
├── main.tf
└── modules
├── 01_variables.tf
├── 02_iam.tf
├── 03_s3.tf
├── 04_cloudwatchlogs.tf
├── 05_codepipeline.tf
└── 06_cloudformation_par

元記事を表示

PythonではじめるAWS CDK

# Pythonで始めるAWS CDK

最近までいろいろと触る機会があったのと、AWS CDK+Pythonの記事が少なかったので書いてみた。
内容はAWS CDKのインストール〜デプロイまで。ついでにLambda関係でよく使いそうなところをいくつか。

## 実行環境

* Python 3.7.4
* OSX Catalina 10.15.5

Python、Pipが実行可能な環境であることが前提で書いています。

## はじめに

### AWS CDKってなに?

[AWS クラウド開発キット](https://aws.amazon.com/jp/cdk/)より

> AWS クラウド開発キット (AWS CDK) は、使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースをモデル化およびプロビジョニングするためのオープンソースのソフトウェア開発フレームワークです。

かなり大雑把にまとめると、使い慣れたプログラミング言語でAWSのリソースを定義、作成できるIaC(Infrastructure as Code)ツールですよっと。

### なんでAWS CDK

元記事を表示

API GatewayでLambdaのエラーハンドリング

題材とするアーキテクチャ

Lambda (2) → API Gateway → Lambda (1)

# API Gatewayの返り値を整形する。

エラー時に400/500台のステータスコードを付してDescriptionをつけて返したい。

__1 Exceptionクラスを継承して拡張した例外クラスを作る。__
__2 エラー時にraiseする。__

“`python:Lambda1
import json
import boto3
import logging
import traceback

logger = logging.getLogger()
logger.setLevel(logging.INFO)

dynamodb = boto3.resource(‘dynamodb’)

# 例外クラスを拡張
class ExtendException(Exception):
def __init__(self, statusCode, description):
self.statusCode = statusCode
se

元記事を表示

OTHERカテゴリの最新記事