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

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

AWS LambdaをScala(Java 11)とGraalVMで

# はじめに

AWS Lambdaを標準で選択できるJava 11のランタイムで動かすと、コールドスタートの問題等があるので、メモリをかなり積んでスペックを上げないといけないですが、Lamdaは積んだメモリと実行時間でコストが算出されるため、実行時間にあまり差が出ない範囲で、メモリはできるだけ少なめに抑えたいところです。

標準で選択できるJava 11のランタイムではなく、GraalVMのnative imageを使ってカスタムランタイムを作成すると、少ないメモリで動かすことができ、コールドスタート時にも爆速起動が期待できます。

ただ、Scalaのバージョン、Javaのバージョン、GraalVMのバージョンの組み合わせにより、実行バイナリが作成できなかったり、作成できても実行時のエラーが解決できなかったり、AWSのライブラリが上手く使えなかったりと、一筋縄ではいかずに沼に嵌っていった経験をされた人も多いのでは。。

今回は、Scala 2.13.3、Java 11、GraalVM 20.1.0の組み合わせで、S3にアクセスし、引数で指定したバケット内のキーのリストを返すようなAW

元記事を表示

CloudWatchのダッシュボードをSlackに通知する

CloudWatch のダッシュボードって超イケてるですけど、見に行くの面倒くさいですよね。
というわけでSlackに定期的に通知するようにしました。

(公式でもっとイケてる手順があるなら知りたい)

## 全体像

Githubにあげてるので詳しくはそこ参照ください
https://github.com/takyam-git/cloudwatch-dashboard-notify-slack

## できること

こんな感じのをLambda経由でSlack通知できるようになります。

![Slack | develop | タノム 2020-10-13 21-48-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/28ef9a78-6f8d-97cf-f30f-f3b00e184793.png)

## 内容

Lambda5千年ぶりくらいに書いたから、最近のプラクティスに添えてない可能性がすごいでかいですが、ポイントは以下

– CloudWatchの画面からsourceをコピペってく

元記事を表示

AWS LambdaでSlackに添付ファイルとして投稿(Python)

Amazon S3からファイルを取得してSlackに添付ファイルとして投稿するAWS Lambdaを作っていたが、AWS LambdaのPython環境にはrequestsモジュールが入っていなかったので苦戦した。

## 前提・環境
AWS Lambda Python環境

## やりたかった事
1. Amazon S3からファイルを取得する
2. ファイルをSlackの`files.upload` APIで添付ファイルとして投稿する(content typeはmultipart/form-dataを使う)

## できなかったこととその理由
Pythonでのファイルのアップロードは、
https://qiita.com/5zm/items/92cde9e043813e02eb68

https://www.it-swarm-ja.tech/ja/python/python%E3%81%A7%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%A8-multipart-formdata%E3%82%92%E9%80%81%E4%BF

元記事を表示

LambdaでLaravelを動作させようと思ったけど、少しコケたのでメモしとく

私はPHPerなのですが、最近、仕事関係でLambdaの話がちょくちょく出てきたので、ちょっと勉強がてら調査することに。

今更なのですが Lambda でPHPを動かせるようになっていたということに驚いた。

で、調べてみるとどうやらbrefというライブラリを使えば、簡単にLambda上でLaravelも動かせるらしい。
Bref – Serverless PHP made simple

わざわざ Lambda で PHPを使う必要があるのかと思うかもだけど、一緒にお仕事しているチームの構成を考えるとメンテナンスも含めてLaravelが使えるというのはとても助かるのです。

で、さくっと試してみようと思ったところデプロイで躓いちゃったので、メモ残しておきます。

## 環境

– Windows 10 Home
Docker Toolbox

元記事を表示

毎日定時に推し画像が送られてくるLINE Bot を作った

# はじめに
松岡茉優ファン(通称まゆらー)である僕が、
僕だけの僕だけによる僕だけのためのLINE Bot を作った。

ファンになって5年くらいになると、

→ツイッターのタイムラインで松岡茉優さん関連のツイートを探す
→松岡茉優さんの画像や動画を保存する

この作業に昔ほどの楽しみを覚えなくなり、かつ私自身も社会人になったりして、毎日ツイッターサーフィンする時間も無くなってきます。

**全部自動化しちゃおう!!**

ってことでその第一弾として、ツイッターで最近人気の画像・動画付きのツイートを検索、画像URL取得、LINE Bot を使って毎日定時に送信する!!!!

よかったら友達追加してください。

友だち追加

![L.png](https://qiita-image-store.s3.ap-northea

元記事を表示

AWS CloudWatchEventsの時間指定をCDKでラクにする。

いっっっっつも失敗するのでJSTで指定してCDKでUTCに変換することにした。

# CDKでCloudWatchEventsを定義する

取り敢えずCloudWatchEventsの定義のとこだけ。
これをよしなにStepFunctionsとかと組み合わせるなり何なりする。

“`Python
# バッチスケジュールをJSTで定義する(cron式で * にする所は空でよい)
props[‘schedule’] = {
‘minute’: 40,
‘hour’: 9,
‘week_day’: ‘MON-FRI’
}

# JSTをUTCに変換する
if props[‘schedule’].get(‘hour’) is not None:
props[‘schedule’][‘hour’] = props[‘schedule’][‘hour’] – 9
if props[‘schedule’][‘hour’] < 0: props['schedule']['hour'] += 24 if props['schedu

元記事を表示

Amazon Elastic Transcoder概要とLambdaからのJob実行

# Amazon Elastic Transcoder

映像・音声をユーザーが再生可能なフォーマットに変換するクラウドサービス

# 用語

– Pipeline
動画を通してトランスコードを行うパイプライン
Pipeline ID が割り当てられ、Lambda 等から使用する際に指定
以下主な設定項目
– 変換元/先の S3 バケット
– 変換完了 SNS 通知

– Job
Pipeline 内で実行するトランスコード処理
Lambda 連携する場合は Lambda から生成、実行する
以下主な設定項目
– 変換元/先ファイル名
– Preset
– サムネイル生成等のオプション

– Preset
トランスコード内容をまとめた設定
Job にてトランスコード内容として指定
AWS で用意されているものかカスタムで生成したものを使用
Preset ID が割り当てられ、Lambda 等から使用する際に指定
Preset一覧:https://docs.aws.amazon.com/ja_jp/elastictransc

元記事を表示

Lambda_備忘録

備忘録用

(notice_unhealthy_to_slack)

“`
import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

# The Slack channel to send a message to stored in the slackChannel environment variable
SLACK_CHANNEL = os.environ[‘slackChannel’]
HOOK_URL = os.environ[‘hook_URL’]

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

def handler(event, context):
logger.info(“Event: ” + str

元記事を表示

Slackに共有されたファイルをサーバーレスでGoogle Driveにアップロードする仕組みを作るまで

# はじめに
社内の要望を受け、Slackに共有されたファイルをGoogleドライブに簡単にアップロードできるSlackアプリを完全サーバーレスで開発した話です。
「要件を整頓する」「アーキテクチャを考える」「Lambdaを利用して開発する」など…
全てが初めてでしたので、どうか温かい目で読んでいただければと思います。

#作ったもの
### **格納くん**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322392/65b4ac83-09ed-e4d2-3a0b-ac2351ef5e2a.png)
(弊社の画伯にアイコンを作成いただきました!)
格納くんは社内の資料管理用に作られたSlackアプリによるツールです。

## 使い方
– ファイルが添付されたメッセージのメニューから起動します。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322392/0b27c75e-8bcf-7fd5-1

元記事を表示

API GatewayとStep Functionsを組み合わせた非同期APIが最強だった話

最強というかカンタン?

サーバーレスの構成として一般的な
API Gateway&Lambdaですが

**API Gatewayは29秒制限**、
**Lambdaは15分制限**があるわけですね

Lambdaの性能を目一杯使いつつ、
そのギャップを埋めるため
**なるべくシンプルな構成で非同期APIにしたい** ってこと
あると思います。

そのときに必要なのは

– LambdaをキックするためのAPI
– キックしたLambdaが完了したか判断し、レスポンスを受け取るためのAPI

だと思いますが、下記Step Functionsにはその**両方が備わっています**

# Step Functions

Step Functionsでは、
マイクロサービスの連携などワークフローを視覚的でイケメンな感じに
構成することができます。

**公式例:**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285581/8d8acfed-7f47-5a2d-589d-feb66a03f

元記事を表示

Lambda&Serverless Frameworkで、multipart/form-data形式でデータを受け取る

## 前書き
最近業務でAWSのLambdaとServerless Frameworkを使うことが多いです。
業務の流れが早く、次から次へと新しいツールを触ってすべて忘れていきそうなので、個人的なまとめとして、記事を作成します。
言語はnode.js, TypeScriptを使用しています。

## multipart/form-dataとは?

>multipart/form-dataは、前述の通り複数の種類のデータを一度に扱える形式で、主な利用シーンはHTMLフォームです。特にファイルアップロードでよく利用されます。
引用元:
[フロントエンド] multipart/form-dataを理解してみよう
https://www.yoheim.net/blog.php?q=20171201

ボディはBoundaryという区切り文字で、ファイル送信時に指定したnameごとに区切られます。

“`
——WebKitFormBoundaryO5quBRiT4G7Vm3R7
Content-Disposition: form-data; name=”message”

Hello

元記事を表示

Lambda・Serverless Frameworkあれこれ(ざっくりとした概要やコマンド)

## 前書き
最近業務でAWSのLambdaとServerless Frameworkを使うことが多いです。
業務の流れが早く、次から次へと新しいツールを触ってすべて忘れていきそうなので、個人的なまとめとして、記事を作成します。
正確性よりも、概要というかざっくりとした全体像みたいなものを把握することを目的としています。
>Done is better than perfect

## Lambdaとは?
「サーバーレス」という種類に属する「サーバー」です(え笑)。
公式(https://aws.amazon.com/jp/lambda/) には、
> AWS Lambda を使用することで、サーバーのプロビジョニングや管理をすることなく、コードを実行できます。料金は、コンピューティングに使用した時間に対してのみ発生します。

と記載されています。
感覚で説明すると、「設定や管理が不要で、プログラムをLambdaの”関数”としてデプロイしておき、そのエンドポイント(URL)にアクセスする、もしくは、関数の実行条件(トリガー)を設定しておくと、プログラム(関数)を実行させることができる

元記事を表示

ECSからLambdaを実行するときに必要なIAMロール

# やりたいこと
ECS TaskからLambdaを呼び出したい。

ECSとそれに付与するIAMロールはCloudFormationで定義しているが、IAMロールが正しいところに対して設定できていないとエラーが発生する。

#### エラーの例
`message:Unable to locate credentials`

# 環境
– 起動タイプ
– Fargate
– OS
– linux(alpine)

# 書き方
詳細については後述

“`sample.yml
AWSTemplateFormatVersion: 2010-09-09

Resources:
TaskRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
– Effect: Allow
Principal:
Service:

元記事を表示

【AWS】APIGatewayにキャッシュを設定する際にハマったこと

#はじめに
先日APIGatewayにキャッシュを設定しようとしてハマったので記事にしておきます。

#キャッシュを無効化させたくない!
エンドポイントへのHTTPリクエストヘッダに**[Cache-Control: max-age=0]**が含まれていた場合も、APIGatewayの後ろに控えたLambdaを実行させたくない!**キャッシュがある場合は必ずキャッシュを受け取ってほしい**。

#APIGateway設定
キャッシュの設定自体はキャッシュ有効化にチェックをつけ、キャパシティーやTTL等を自由に設定しておしまいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/7843e19e-48d7-2e63-3951-76ec4bdfa081.png)
キャッシュコントロールヘッダについての設定は「キーごとのキャッシュの無効化」にあたります。
画像の設定では「認可されたリクエストで無ければ、HTTPリクエストに**[Cache-Control: max-age=0]*

元記事を表示

AWS S3で公開している静的サイトにBasic認証をかける

AWS S3で公開している静的サイトにBasic認証をかける方法です。
S3の他に、LambdaとCloudFrontの設定が必要になります。

# S3バケットの作成
まずはBasic認証をかけたいS3のバケットを用意します。
パブリックアクセスの許可や、Static website hostingの設定は必要ありません。

# CloudFrontの設定

Create distribution -> Web側のGet Startedを選択し、CloudFrontの設定に進みます。

![CloudFront Get Started](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279032/2eed0ac0-2f77-2f3b-99bb-7a2a9041a4d5.png)

`Origin Domain Name` にBasic認証をかけたいS3のバケットを指定します。
`Origin ID` は自動的に設定されます。
`Restrict Bucket Access` を `Yes` にします。
`Ori

元記事を表示

brefphpを使って簡単にLaravelをサーバレス環境で動かす

# はじめに

ここではbrefについてと、実際の使い方や使ってみた所感などをまとめてみようと思います。

## [brefphp](https://bref.sh/) とは?

PHPアプリケーションをAWS Lambdaに簡単にデプロイするための [Composer](https://getcomposer.org/) パッケージです。
コマンド1つでサーバーからアプリケーションのデプロイまで行えます。

# :information_source: 使い方

## Step :one: serverless のインストール

bref は serverless コマンドを使用してAWS環境にデプロイを行います。
以下のコマンドでインストールしましょう。

npmの場合

“`
npm install -g serverless
“`

yarnの場合

“`
yarn global add serverless
“`

追加したら以下のコマンドでちゃんと実行できるか確認しましょう

“`
$ serverless –version
Framework Core: 2.

元記事を表示

フリートプロビジョニング前にフックするLambdaの作成例

https://qiita.com/takmot/items/eda7c2f519581b40ec3f
前回記事の続きとして、フリートプロビジョニング前にフックするLambdaの作成例を記載します。

## プロビジョニング許可/拒否判定方法

1. シリアルナンバーと、プロビジョニング許可/拒否を表す値を記載したCSVファイルをS3に格納
2. LambdaからこのCSVファイルを参照し、デバイスから通知されたシリアルナンバーからプロビジョニング許可/拒否判定

以下CSVファイル例

“`
SerialNumber,Effect
1,Allow
2,Deny
3,Allow
“`

## Lambda関数

### 変更前コード

“`python
import json

provision_response = {‘allowProvisioning’: False}

def isBlacklisted(serial_number):
#check serial against database of blacklisted serials

def l

元記事を表示

Seleniumとheadless chromeをAWS lambdaに入れてみました。(Win10環境下の注意点等)

Python でWeb Scraper を作る時に、対象ターゲットのがclient-side javascript で取得している際、単純にurlopenではほしい情報を取得できないことが多いです。そのため、SeleniumかAPI(もしあれば)で取得することが多いと思います。

一方で、定期的に、かつ経済的に何かを実行したい時には、on-demand のAWS lambdaとCloudEvent を使用するのが良いでしょう。

では、スタート

## 手順

### 環境構築

Windows環境下でAmazon LinuxをOSにしたAWS lambdaを使うには、**Ubuntu on Windows 10** かその他remote linux server の支援が必要です。今回はより経済的な方法として、Ubuntu on Windows 10 を選択。

具体的なインストール方法は以下参照すると良いでしょう。

[Windows 10でLinuxを使う](https://qiita.com/whim0321/items/093fd3bb2dd287a72fba)

次に、P

元記事を表示

API実行ログをSlackに出力する

##はじめに
[前回の記事](https://qiita.com/ktsuchi/items/f99a7b5017306f4e6537)の続きです。

前回は、WebページのボタンからAPIを実行させるところまでを実装しました。
今回は実行ログの出力について記載します。

前回作成したAPIは限定された人しか実行できないようにしている訳ではなく、
Webページにアクセスできる人であれば誰でもボタンを押すことで実行できてしまいます。

そのため、どのIPから、どのような端末で、いつ実行したのかが記録として残るように、
API実行ログを出力させる方法にしました。

##構成図

赤枠で囲った部分が、今回のログをSlackに出力する構成です。

2つのLambdaを使って、API GatewayからCloudWatch Logsに出力されたログを整形してSNSに送り、
SNSに来たメッセージをSlackに送信してます。
(もっと効率的な方法があるかもしれませんが)

![ScreenShot 2020-10-08 9.06.38.png](https://qiita-image-store

元記事を表示

AWS Lambda LayersへZenpyをデプロイしてみる

[Zendesk API](https://develop.zendesk.com/hc/en-us/categories/360000003388)をPythonから簡単に呼び出せるようにするラッパー[Zenpy](http://docs.facetoe.com.au/zenpy.html#)をAWS Lambda Layerに入れてみます。

# なぜLambda Layerを使うのか?
AWS Lambdaへプログラムをデプロイする際に関連するライブラリ群も一緒に入れる必要があります。そのため、複雑なプログラムになるとデプロイパッケージが肥大化しがちでした。
ライブラリやカスタムランタイム、その他の依存関係をまとめたZIPパッケージです。

– AWS公式ドキュメント: [AWS Lambda レイヤー](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html)

# この記事で行うこと
AWS Lambda Layerへ`Zenpy`ライブラリをデプロイする。

# 事前準備
*

元記事を表示

OTHERカテゴリの最新記事