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

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

aws-sdkでSTSを利用してDynamoDBにputItemする時の注意点

# はじめに
Lambdaを使って別アカウントのDynamoDBにputItemする際にハマったことをメモ。

DynamoDBにputItemするのは初めてだったので、
事前に同一アカウントのDynamoDBにputItemをした。

# やったこと
– Lambdaから同一アカウントのDynamoDBにputItem
– LambdaからSTSを使って別アカウントのDynamoDBにputItem

# Lambdaから同一アカウントのDynamoDBにputItem

[AWS.DynamoDB](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#putItem-property)クラスを使用

“`index.js
const AWS = require(‘aws-sdk’);

exports.handler = async (event, context) => {
const dynamodb new AWS.DynamoDB()

cons

元記事を表示

Lambda@EdgeのテストをJestで書く

# 概要

Lambda@Edge の単体テストを [Jest](https://jestjs.io/ja/) で書いたときのメモ。今回書いたのは Lambda@Edge だけど、Lambda でも基本的には同じはず。Jest はシンプルで良いですね。

# 導入方法

導入したいディレクトリを作成して、そこで以下のコマンドを入力していく。Jest の導入はすごく簡単。

* `npm init`
* npm を初期化する
* インタラクティブに設定項目を聞かれるので、お好みで設定
* `test command` だけ `jest` と入力する
* `npm install -D jest`
* jest をインストールする

# テスト対象ファイル

今回テストするファイルはこちら。Lambda@Edge のリクエストオリジンで動作させるような処理。

“`javascript:main.js
“use strict”;

exports.handler = (event, context, callback) => {
const reque

元記事を表示

Lambda x Amazon SNSで、AWSの請求額を毎日メールで通知する

#はじめに
CloudWatchで請求アラートを設定する事はできますが、超心配性な自分としては、月初~前日までの請求額を毎日メールで確認しておきたい。
AWS Lambdaとwebhookを使ってSlackのチャンネルに通知する方法は多く見られましたが、メールで通知する方法は意外と多くなかったので、まとめてみました。

# 概要
+ 請求額はCost Explorerから取得する。
※CloudWatchから取得する方法もありますが、[双方に差異があり正しい値はCost Explorerである](https://hacknote.jp/archives/44913/)という情報があったため、Cost Explorerを使う事にしました。
+ Lambda関数のランタイムはPython3.7とし、Python 向けのAWS SDK(Boto3)を利用する。
+ トリガを設定したLambda関数にて、月初~前日までの合計請求額とサービス毎の請求額を取得し、その内容を整形し、メッセージとしてAmazon SNSのトピックに発行する。
+ メッセージを受け取ったSNSトピックは、紐

元記事を表示

AWS Lambda で遅延情報を通知してくれる Slack bot を書いてみた

# はじめに
– 以前AWS Lambdaを用いて作成したSlack Botについてまとめる機会があり、せっかくなので備忘録含めQiitaにも投稿しようと思いました。
– 作成当時の記憶はだいぶ薄れておりますが、覚えている範囲で引っかかったところなどどなたかの参考になれば幸いです。

※ 本記事のbotを作成したのは約2年前なので、現在の仕様と乖離する部分もありますがご了承ください。
※ 作成したbotそのもののソースは以下となります。
https://github.com/spinrock/delayTrainBot

# そもそもSlack bot作成に至った経緯
– 筆者の家は、複数路線の駅に挟まれた立地にあり、駅から別の駅への移動が大変でした。
– 駅に到着後に遅延に気付いても別の路線に乗る(駅を移動する)、という選択肢をとることが難しい状況でした。
– 起床時に自分で路線情報を確認できればいいのだが、朝の時間帯はバタバタしていることが多く、見逃す日も多分にありました。
– 普段から確認するツール(LINEやSlack)に通知が来て教えてくれると便利なのに

元記事を表示

高知の「あしたの分も買うちょくきね。~飲食券先買い応援プロジェクト~」の参加店舗を勝手にgoogle map上のマーカーでわかるようにした

**高知に行きたくても行けないので勝手にやりました**
https://script.google.com/macros/s/AKfycbzRJCvOuWC5uMFiqhl5soiLHnWbkGE5P-GAkxFmVT08u_3E2hRi/exec

あしたの分も買うちょくきね。~飲食券先買い応援プロジェクト~「参加店舗」
https://www.kochinews.co.jp/norikoeyo/asukau_eatery/
この店舗一覧をgoogle map上のマーカーでわかるようにしました

## 構成

– フロントはgoogle app script
– フロントからAPI Gateway+LambdaのAPIを呼び店舗情報を取得
– 店舗データはDynamoDBに保存

という完全サーバレスです

## まずは店舗一覧のデータ作成

https://www.kochinews.co.jp/norikoeyo/asukau_eatery/
このサイトをスクレイピングするlambdaを書きます(python)
座標取得するため、googleのAPIキーも事前に取得しておきました

元記事を表示

sam apiGateway lambda callback 502

# SAM apiGatewayに返却するフォーマット

## 経緯
Googleの検索をAPI以外でやりたくなりました。

そこでGoogle検索になんどもAPIを介さずにアクセスしていたら怒られました。
サーバからやっていたら too meny access 〜〜というエラーが返されるようになり、そこから数時間使えない。
API使えばいいいので困りはしないけれど、解決しておきたくて、ちょっと迂回してみました。

試したところIPを変えれば動くため、動的に変わるIPを持つ仕組みに乗っかろうと考えてlambdaを、
前段に通信が必要だったためapiGatewayを設けて apiGateway + lambda の構成になりました。

この構成で必要になる、lambdaからapiGatewayに返すcallbackのフォーマットを残しておきます。

### lambdaからapiGatewayに返すコールバックフォーマットはこうすればOK

var response = {
“statusCode”: 200,
“headers”: {

元記事を表示

Datadog enhanced AWS Lambda metrics を試してみる

# enhanced AWS Lambda metrics とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/4d43700c-9d73-44b8-e3ae-c48d05e6837d.png)
DatadogにてAWSを連携すると出てくるデフォルトダッシュボードの中に存在する謎なやつ(図の下側)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/50f42a20-7ee5-0bab-e3ff-1fa8ec3c56b5.png)

とりあえず開いてみても情報なし、下側のInvocationsの値は入ってるのに、上側のInvocationsには値が入ってない :thinking:

参照元メトリクスを見てみると別物参照してますね
上側: `aws.lambda.enhanced.invocations`
下側: `aws.lambda.invocations`

en

元記事を表示

【AWS】Lambda+Amazon SESでメールを送信する

[前回の記事](https://qiita.com/duplicate1984/items/8a3ce5c434a44b2b04fd)でAmazon SNSを利用してSMSを送信するlambdaを書きました。
今回はメールを送信するためにAmazon SESを利用していきます。

#やりたいこと
lambdaからのキックでメールを送信したいと思います。
ただし、宛先のメールアドレスはlambda内で指定したいと思います。

Amazon SMSでもメールの送信は可能ですが、予め作成したサブスクリプションで認証済みのメールアドレス宛にしか送信できません。
そこで今回はAmazon SESを使用します。

#Amazon SESって?
システムエンジニアリングサービス…ではなく
Amazon Simple Email Serviceです。

従量課金制のEメール送信サービスです。
2020年5月現在、東京リージョンではサポートされていません。
エンドユーザーへのマーケティングや、ヘルスチェック系の通知などに利用できます。

#コードとかより注意しておきたいこと
###サンドボックスの解除

元記事を表示

AWS IoTボタンを押すと動物の鳴き声をgoogle homeで再生する2歳児向けおもちゃを作ってみた

AWS IoTボタンを押すと動物の鳴き声を再生する2歳児向けおもちゃを作ってみました。
きっかけは動物好きな子どもが親の真似をして 「おけーぐるぐる ぞうの声」 とgoogle homeに向かって何度もしゃべっても認識できない
→親に「おけーぐるぐる ぞうの声 っていって」と何度も言われるような状況がうまれ、しんどい。。。
そこでボタン押すだけなら操作なら2歳児でもできるでしょ!と思い作成しました。

構成

構成はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/6c115d8c-e0ae-593a-6814-f430f6223b56.png)
1.Amazon IoTボタンを押す
2.ラムダ関数が起動(ただGETメソッドを実行するだけ)
3.ローカルのサーバーが起動(ngrokを使うことでインターネット上に公開)
4.google homeがしゃべる!

作成手順

作成手順はこんな感じです。
1.LAN環境でgoogl

元記事を表示

CloudWatch Synthetics & Puppeteer ことはじめ

今さらながらCloudWatch SyntheticsでWebサイトの監視をしたのでまとめます。

# この記事の内容
* CloudWatch Syntheticsのために手動でS3バケットとIAM Roleを作る
* ローカル環境にPuppeteerをインストールしてNode.jsのコードを書く
* Googleのトップページに「猫 wikipedia」を入力して検索する
* トップにWikipediaの[記事](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%B3)が出てこなかったら異常事態なのでスクショを撮ってCloudWatchでアラートを上げることにする
* このコードをCloudWatch Syntheticsに持って行ってCanaryを作成する

きちんとした環境構築などはしていません。非常に意識の低い内容となっています。。

# まず最初に:勝手にバケットやIAMを作ってほしくない
最初のセットアップで `s3://cw-syn-results-999999999999-ap-northeast-1` というS3バケ

元記事を表示

AWS SAM CLI で Lambda Layers が ビルドできるようになったよ

**Building Layers**
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/building-layers.html

“`shell-session
$ sam build layer-logical-id
“`

SMA CLI のバージョンが 0.50.0 以上である必要があります。

“`shell-session
$ sam –version
SAM CLI, version 0.50.0
“`

SAM CLI の基本的な使い方については、以前 Qiita にあげたのでこちらも参照いただければと思います。

**AWS SAM CLI 再入門 2019.12**
https://qiita.com/hayao_k/items/7827c3778a23c514e196

## 簡単な例
sam init で作成できる Python 3.8 の Hello World Example を例に考えます。

“`shell-session
$ sa

元記事を表示

Lambdaとは

#AWS Lambda とは
> AWS Lambda はサーバーをプロビジョニングしたり管理する必要なくコードを実行できるコンピューティングサービスです。

##関数の AWS Lambda 管理
> AWS Lambda API またはコンソールを使用して Lambda 関数の設定を行います。「基本的な関数設定」には、Lambda コンソールで関数を作成するときに指定する説明、ロール、およびランタイムが含まれています。関数の作成後にその他の設定を行ったり、API を使用してハンドラー名、メモリ割り当て、セキュリティグループなどの内容を作成時に設定したりすることができます。

> 関数コードの外でシークレットを保持するには、関数の設定にシークレットを保存し、初期化時に実行環境から読み取ることができます。環境変数は、保管時に必ず暗号化されます。また、クライアント側でも暗号化できます。外部リソースの接続文字列、パスワード、エンドポイントを削除することにより、環境変数を使用して、関数コードを移植可能にすることができます。

> バージョンとエイリアスは、関数のデプロイおよび呼び出しを管理す

元記事を表示

HTTP APIでLambda関数にPOSTしたbodyの値が ‘[object Object]’ になる時の解決法

AWS Lambdaの関数にHTTP APIで値をPOSTする際につまづいたのでメモ。

# 環境
– macOS
– AWS Cloud9
– Node.js 12

# 問題

Node.jsのfetch()メソッドで、自作したAWS Lambda関数にPOSTで値を送信しました。
Lambdaの呼び出しはAPI GatewayのHTTP APIを用いています。

## Lambda関数のコード

デバッグするために、Lambda関数では一旦eventを返すようにしています。
console.logで出力してCloudWacth Logsで確認しても良いと思います。

“`Javascript
exports.handler = async(event, context) => {
console.log(event)

return event
};
“`

## 実行コード

“`Javascript
require(‘dotenv’).config()
const env = process.env

var fetch = requi

元記事を表示

初めてのAWS Lambda〜Hello World

## AWS Lambdaとは
サーバレスでコードを実行でき、Java、Go、PowerShell、Node.js、C#、Python、Rubyをサポートしている
https://aws.amazon.com/jp/lambda/faqs/

## 実際に使ってみる
AWSのチュートリアルを参考に。
https://aws.amazon.com/jp/getting-started/hands-on/run-serverless-code/

– コンソールを起動
「コンピューティング」→「Lambda」
スクリーンショット 2020-05-18 19.08.51.png

– 設計図を選択
設計図=テンプレートのようなものかな?
「Hello」で検索すると、node.jsとpythonの「Hello Wo

元記事を表示

AWS Kendra使ってドキュメント検索(API Gateway+Lambda)

# Kendra
##AWS Kendraとは
https://aws.amazon.com/jp/kendra/

>Amazon Kendra は、機械学習を原動力とする高精度で使いやすいエンタープライズ検索サービスです。Kendra は、ウェブサイトおよびアプリケーションに強力な自然言語検索機能を提供するため、エンドユーザーは企業全体に散在する膨大な量のコンテンツ内で必要な情報をより簡単に見つけることができます。

https://dev.classmethod.jp/articles/kendra-reinvent2019/

re:Invent 2019で発表された。
エンタープライズ検索って言って社内ドキュメントの中から、欲しい情報を簡単に探せるよっていうサービスっぽい。日本語はまだ未対応。

簡単にデータソースの設定ができて、深層学習モデルをアクティブに再訓練して、検索の正確性がどんどん上がっていく、と。

## S3にファイルアップロード
今回はデータソースはS3を使うので、適当にネットから拾ってきたデジカメの取扱説明書を置いておく。英語しか対応していないので英語版。

元記事を表示

お気に入りpythonモジュール達やバイナリを1つのLambda Layerにまとめるスクリプト

LambdaとLayersは便利ですが、1つの関数につき上限は5つまでと制限があります。
Layersは=1モジュールとして運用しているケースが多いかと思いますが、意外と足りなくなったり1つずつ追加するのは手間です。
お気に入りのモジュールたちはお馴染みの`requirement.txt`で管理し、1つのレイヤーにまとめてしまいましょう。

テストで6つのモジュールをインポートする[requirement.txt](https://github.com/umihico/fav-py-modules/blob/master/requirements.txt)を作成します。

“`bash:requirement.txt
selenium
requests
Pillow
lxml
numpy
Flask
“`

そして同階層にて以下の[スクリプト](https://github.com/umihico/fav-py-modules/blob/master/publish_layer.sh)を実行します。dockerの
pythonのバージョンや、awsコマンドの引数は必要に応じて編集し

元記事を表示

aws-serverless-expressのサンプル動かないんだけど

# 動かないやつ
https://github.com/awslabs/aws-serverless-express/tree/master/examples/basic-starter
`npm run setup`

# 出てたエラー
“`
An error occurred (ValidationError) when calling the CreateChangeSet operation: Stack:arn:aws:cloudformation:ap-northeast-1:363880502757:stack/AwsServerlessExpressStack/aaaaaaaaaaaaaaaaaaa is in ROLLBACK_COMPLETE state and can not be updated.
npm ERR! code ELIFECYCLE
npm ERR! errno 255
npm ERR! aws-serverless-express-example@2.1.1 deploy: `aws cloudformation deploy –templa

元記事を表示

遠隔押印マシーン『InCaaaan(インカーン)簡易版』の作り方

新型コロナ禍でテレワークが急速に普及しています。
しかしながら、押印が必要なため、テレワークができず、出社を余儀なくされてる人がたくさんいます。

そんな方々のために、出社しなくても押印ができるマシーン「InCaaaan(インカーン)」の作り方をご紹介します。
(本当は自分用の備忘録ですが)