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

Lambda関連のことを調べてみた2022年05月10日
目次

API Gateway+LambdaのAPI実行時にMissing Authentication Tokenとなった場合の確認観点

## はじめに
API Gateway + LambdaでAPIを作成して、アクセスした際にタイトルのエラーが発生したので、その際の確認観点を記載します。

## エラー内容
– ステータスコード: 403
– エラーメッセージ: Missing Authentication Token

## 試したこと
### Missing Authentication Tokenで検索
– 認証情報周りは特に問題なさそうでした。

### 403のステータスコードの意味を検索
ウィキペディアによると、以下と書いてあります。

> ページが存在するものの、特定のアクセス者にページを表示する権限が付与されず、アクセスが拒否されたことを示すもの。また、サイトの制作者側の設計ミスによる障害やサイトが非常に混雑している時、URLが間違っている場合にも表示されることがある。

Ref:https://ja.wikipedia.org/wiki/HTTP_403

> URLが間違っている場合にも表示されることがある。

とあったので、この観点で確認してみました。

## 原因
– 上記の通り、APIのエン

元記事を表示

【AWSハンズオン】サーバーレスクラウドを利用してSNSアプリを実装する。

こんにちは、k_ukiです。
現在、「AWSではじめるクラウド開発入門」という書籍の12章を進めています。
ここでは、10章,11章で学習したサーバレスクラウド(Lambda,S3,DynamoDB)を使用し、シンプルなWebアプリを実装するという内容でした。今回のハンズオンで学んだことをここにまとめていきます。

## アプリの説明
### アプリの概要
利用者が考えて作った俳句を投稿し、ユーザがいいねできるようなSNSアプリです。
また、アプリ名を”Bashoutter”としています。
機能要件は以下の通りです。
– 俳句の一覧を取得
– 俳句を新規投稿する。
– 俳句にお気に入り表を一つ入れる
– 俳句を削除する
### API

上記の機能要件を満たすための最小限の設計として4つのREST APIを実装しています。

GET/haiku 俳句の一覧を取得
POST/haiku 俳句を新規投稿する。
PATCH/haiku/{ite

AWS Lambda 実践ガイド 第2版でつまずいたところまとめ

AWS Lambda 実践入門 第2版でつまずいたところを忘備録的にまとめておく。

# 1. 書籍のとおりにカスタムドメインのマッピングをやるとアクセスに失敗

図6-102のとおりにLambda関数をカスタムドメインにマッピングすると6-9-5が以下のエラーをCloudWatchで吐くようになって失敗する。

“`
The IAM role configured on the integration or API Gateway doesn’t have permissions to call the integration. Check the permissions and try again.
“`

原因は、図6-102で「パス(オプション)」を設定しているため。ここに文字列を指定すると、関数を呼び出すためのURLで関数へのルートの前にこのパスが付与されてしまうため。つまり、図6-102のとおりに進めると以下のようなURLを生成してしまうことになる。

“`
https://api.aws-bookexample.com/userregistFunction/user

Error: Failed to parse template: ‘utf-8’ codec can’t decode byte 0x83 in position XXX: invalid start byteの対処法

## はじめに
sam local invoke時に題記のエラーが発生したので、対処法を調べてまとめます。

“`bash
sam local invoke –skip-pull-image –event .\devfiles\event.json –template .\devfiles\template.yaml
Error: Failed to parse template: ‘utf-8’ codec can’t decode byte 0x83 in position 734: invalid start byte
“`

## 対処方法
template.yamlがUTF-8でなかったので、UTF-8で保存し直しました。

## 参考
https://teratail.com/questions/120137

Lambda 関数 URL

# 概要

従来は、HTTP(s)経由で、API Gateway –→ Lambda とアクセスしていたが、関数 URL がサポートされた事で、API Gateway なしででアクセスできるようになった。

パブリックに公開するAPIや、簡易な認証実装でも差し支えの無いAPIの場合は、AWSLambdaで実装する場合には、関数 URL の利用を検討するとよい。

# 認証タイプ

「認証タイプ」には**AWS_IAM**と**NONE**があります。

– **AWS_IAM** : 認証された IAM ユーザーとロールのみがアクセス可能。
– **NONE** : パブリックにアクセス可能。

# CORS

CORS を使用して、任意のドメインから関数 URL へのアクセスを許可することも可能。

# 参考URL

https://aws.amazon.com/jp/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/

#

Lambda@Edge のオリジンリクエストで、bodyの内容を書き換えてレスポンスを返す方法 [sync-request]

# はじめに

Lambda@Edge(以後、L@E)で、bodyの一部を書き換えてレスポンスを返す方法についてまとめました。

L@Eでbodyを書き換えるには、ビューアーリクエストもしくはオリジンリクエストで可能です。2つの違いは以下になります。

>ビューワーリクエスト
>- CloudFront がビューワーからリクエストを受け取ると、リクエストされたオブジェクトが CloudFront キャッシュにあるかどうかを確認する前に関数が実行されます。

>オリジンリクエスト
>- CloudFront がリクエストをオリジンに転送したときにのみ、関数が実行されます。リクエストされたオブジェクトが CloudFront キャッシュ内にある場合、関数は実行されません。
L@Eでbodyを書き換える際の制限は他にもあり、下記のドキュメントに記載されています。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html#lambda-at

【AWS】Lambda Function URLsを使用したLineBot運用に切り替えた所感

## はじめに
今までLambdaにエンドポイントを追加する際はAPI Gateway等を使用することが必要でしたが、
2022年4月6日よりLambda内でエンドポイントを追加できる「Lambda Function URLs」が公開されたため切り替えて試してみました。

DBデータを参照するLineBotにLambdaを使用して運用しているため、実際の使用感についても後述しています!

## 対象者
この記事は下記のような人を対象にしています。

– AWSに興味がある方
– API Gateway + Lambdaの構成で開発している方
– Lambdaにてエンドポイントを追加したい方

## 所感
1. 設定に関して

設定した手ごたえが無いくらい簡単に設定ができました。
手順調査の方が時間が掛かり切り替えに手を動かしたのは5分程です!

2. 実際に運用しているLineBotでの使用感

一定時間Lambdaへのアクセスが無い場合、API Gateway + Lambdaで運用していた頃よりもほんの少しタイムラグがある印象ですが、それほど気にならないくらいのレ

Lambda@Edge のリクエスト利用パターン集

# はじめに
Lambda@Edge(以後、L@E)を様々なパターンで使用したため、まとめます。

# CF2とL@Eの比較
CloudFront Functions に比べて、オリジンリクエスト、オリジンレスポンスで使用できる点や、リクエスト本文を修正できる点において、L@Eは優れているかと思います。

| 1 | 2 | 3 |
|:-:|:-:|:-:|
| | CloudFront Functions | Lambda@Edge |
| ランタイムサポート | JavaScript(ECMAScript 5.1準拠) | Node.js、Python |
| 実行場所 | 218 以上の CloudFrontエッジロケーション | 13 の CloudFrontリージョンのエッジキャッシュ|
| CloudFront トリガー | ビューアリクエスト / ビューアレスポンス | ビューアリクエスト / ビューアレスポンス / オリジンリクエスト / オリジンレスポンス |
| 最大実行時間 | 1 ミリ秒未満 | 5 秒 (ビューアトリガー) / 30

Lambdaで、現在日時と特定の日付を容易に比較する (Node.js)

# はじめに
Lambdaで、現在時刻と、特定の期間を比較して、範囲内かどうか短いコードで判定する方法をまとめました。
面倒なので、ライブラリも使用しない方法になります。

# 現在日時が特定の期間内かどうか判定
## 解説

– `getTime()`は常にUTCでの値の取得になるため、現在日時もUTCで取得します。

– `content.from`と`content.to`に特定の日付を入れてください。
(必ず`”xxxx-xx-xxTxx:xx+09:00″`の形式になるようにしてください。)

– UTCでの比較にはなりますが、`content`内の`”xxxx-xx-xxTxx:xx+09:00″`は、JSTにしております。

つまり、現在時刻は`UTC`、`content`内は、`JST`から`getTime()`によって`UTC`に変換され、`UTC同士で比較`されることになります。

下記の場合ですと、
日本時間で、`2022/5/5の12時`〜`2022/5/8の12時まで`の範囲に現在日時が入っているかどうか判定します。

## コード内容

“`js
c

【AWS】Lambdaのハンズオンで学んだことをまとめる。

## はじめに
こんにちは、k_ukiです。
「AWSではじめるクラウド開発入門」の10章と11章を進めていきました。
そこでは、サーバーレスクラウドに関連する技術が取り上げられており、「Lambda」「S3」「DynamoDB」の3つの技術をハンズオン形式で学習しました。

その中でも、今回は「Lambda」について学んだことをまとめていきます。

## 「Lambda」とは?

簡単にまとめるとサーバーレスコンピューティングにおいて、プログラムの処理を担う部分にあたります。

Lambdaを理解するにおいて、まずサーバーレスコンピューティングの概要について学ぶ必要があります。

### サーバーレスコンピューティングとは?
今回は、webアプリケーションを開発&デプロイするケースを例とします。
従来通りであればプログラムを実行するためのwebサーバが必要となります。また、そのwebサーバーを実行するためのOSサーバーの環境なども構築する必要があります。webアプリケーションを開発&デプロイする際に、実行環境の構築はかなり大変な

AWS Lambdaで列車運行情報をLINEへ通知【Python】

# 背景

この記事の処理内容を、スクレイピングからAPIでの情報取得へ変更したことを紹介します。
👇

https://qiita.com/_whitecat_22/items/1fc804847dce27d5fb94

# 1.環境

– Python 3.9.x
– AWS Lambda
– Amazon EventBridge …定期的に実行するため
– Amazon Simple Notification Service (SNS) …終了通知をCloudWatchへ渡すため
– Amazon CloudWatch …ロギング
– Amazon Simple Storage Service (S3) …Lambda関数のアップロード先
– [LINE公式アカウント](https://www.linebiz.com/jp/service/line-official-account/)

# 2.開発

## 2.1.Pythonコード

– スクレイピングの処理を、公共交通オープンデータセンター 開発者サイトから登録すると利用可能なAPIへ変更しました。
※ユ

AWS Lambda FunctionURLs触ってみる(JavaScript Hands-on)

## はじめに
2022年4月頃からAWS LambdaでHTTP通信が可能になった!!今まで、RESTAPIを作ろうとすると、API Gateway + Lambdaで作らなくてはいけなかった。しかし、サービスアップデートにより、Lambdaから直接叩けるようになった。(感動)。LambdaでAPIを作った事がある人ならば、何でAPIGateWayわざわざ用意しないとHTTP通信できないんだ??っていうのは誰もが感じてた事。ようやく、その不満から解消することができるようになったようなので、今回触ってみることにした。

## 所感
めっちゃ簡単。GUIのぽちぽちで1分で関数が作れるのがいい感じ。FunctionURlsという機能をONにすることでHTTP通信ができるようになっているようだ。ただ、色々と縛りがあるので、用途に合わせて利用するのが良さそうだ。本番環境で利用するには時期尚早って感じかな。

### Hands-onスタート
![スクリーンショット 20

『Python サーバレスアプリ 開発入門』備忘録

『Python サーバレスアプリ 開発入門』ではFlaskをLambdaで動かす手法を学べます。一通り写経を終えたので、つまづいた点を書き留めておきます。

版:初版第1刷
環境:MacBookAir2020 BigSur11.6
本書での環境とちょっと違いvenvを使って仮想環境を作っています。

__(追記)まずは、公式githubをみて!!!__
[「動かして学ぶ!Pythonサーバレスアプリ開発入門」 サンプルコード](https://github.com/chaingng/shoeisha_serverless_python_tutorial#readme)
大体ここで述べられています。途中から気づきました。

=======================

__公式サイトで掲載されている誤植__

2022/4/27現在公式サイトに掲載されている通り、p93に1文字だけ間違いがあります。

“`:誤
AWS_ACCESS_KEY_ID = ‘AWS_ACEESS_KEY_ID’
“`
“`:正
AWS_ACCESS_KEY_ID = ‘AWS_ACCESS_KEY_

ラジオ番組をAWSLambdaでS3へ

# 話の概要
AWS lambdaでsh shellも実行できる。
shellが実行できれば、実行できるバイナリがなにがあるのかがわかる。
足りないバイナリはレイヤとして追加すれば、/opt/bin以下に入って、普通に動作する。
これらを足し算すると…
rec_radiko_ts.shをつかって、S3バケットに保存ができます…ともあれ技術的には
という話。

話は

https://note.com/nyadorya/n/n0b7f6425fe60

とリンクしますので、そちらもどうぞ。

# 前提
rec_radiko_ts.shを最大限生かす。というか、いじりたくない。
というわけで、rec_radiko_ts.shは必須です。

https://github.com/uru2/rec_radiko_ts

# lambdaで
経緯はnote側に記載してますので、こちらは技術的な話を。

必要なことは以下のとおり。
1. 最終的に保存するバケットを作る
1. 必要最低限のロールを定義する
1. 必要最低限のポリシーを定義する
1. つくったロールにポリシーをアタッチする

AWS利用料をDailyでメール通知するlambda関数

# 内容
AWS利用料をDailyでメール通知するlambda関数です。

# 設定
* SNS Topic作成
* Lambda用のロール作成
CostExploereへアクセス(ce:GetCostAndUsage)及びSNSのパブリッシュ(sns:Publish)権限
* Lambda関数作成
* EventBridgeからスケジュール設定

# コード

“`python
import boto3
import datetime

# SNS Topic
topicArn = ‘arn:aws:sns:ap-northeast-1:”account_id”:”topic_name”‘
# 1 days ago
date1 = (datetime.datetime.now() – datetime.timedelta(days = 1)).strftime(‘%Y-%m-%d’)
# 2 days ago
date2 = (datetime.datetime.now() – datetime.timedelta(days = 2)).strftime(‘%Y-%m-%d’)

定期的に全EC2サーバを停止する設定

# 内容
AWS検証環境でEC2の停止を忘れてしまうことがあるので、全EC2サーバを1日1回停止する運用をいれます。
EventBridgeの「EC2 StopInstances API呼び出し」を使用しようと思いましたが、全てのインスタンスIDを指定する方法が分からなくlambda関数を作成しました。

# コード
同一AWSアカウント内で起動中の全EC2サーバを停止します。

“`python
import boto3

client = boto3.client(‘ec2’, region_name = ‘ap-northeast-1’)

def lambda_handler(event, context):
ec2_list = client.describe_instances()
for ec2_reservation in ec2_list[‘Reservations’]:
for ec2_instance in ec2_reservation[‘Instances’]:
ec2_instance_id = ec

CloudFront Functions の活用パターン集

# はじめに

CloudFront Functions(以後CF2)は、L@Eと異なり、軽量のため、L@Eより優先して使用を検討する必要がようなので、CF2について使用パターンをまとめました。

ビューアーレスポンスは使用しなかったため、ビューアーリクエストのみのパターンになります。

# CF2とL@Eの比較

| 1 | 2 | 3 |
|:-:|:-:|:-:|
| | CloudFront Functions | Lambda@Edge |
| ランタイムサポート | JavaScript(ECMAScript 5.1準拠) | Node.js、Python |
| 実行場所 | 218 以上の CloudFrontエッジロケーション | 13 の CloudFrontリージョンのエッジキャッシュ|
| CloudFront トリガー | ビューアリクエスト / ビューアレスポンス | ビューアリクエスト / ビューアレスポンス / オリジンリクエスト / オリジンレスポンス |
| 最大実行時間 | 1 ミリ秒未満 | 5 秒 (ビューアトリガー)

AWS Lambda Function URLsでEverything(It’s you)をおうむ返しするLINE bot

Lambda関数をHTTPSエンドポイントから実行可能になったとのことで、LINEおうむ返しbotを作って「Everything(It’s you)」してみました。

https://aws.amazon.com/jp/about-aws/whats-new/2022/04/aws-lambda-function-urls-built-in-https-endpoints/

## 必要なもの

1. AWSアカウント(Lambda作成)
2. LINE Developers登録

## Lambda側

#### 関数の新規作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/cf90d3b5-78bc-336f-06ec-a6e137b5c94c.png)

こんな感じに作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/6cdef038-f

Serverless アーキテクチャでWeb API を構築するハンズオンをRubyで実装してみた

# 概要
AWSが提供している、[翻訳Web APIのハンズオン](https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Serverless-2019_Contents.html)をRubyに変えて作ってみました。
※ハンズオン内ではpythonを利用されています。

# 前置き
ほとんどハンズオンの流れと同じため、AWS周りの流れは省略しています。

# 1. Lambda 単体で使ってみる
LambdaからTranslateを呼び出して「おはよう」を「Good morning」へ変換しました。
[Module: Aws::Translate](https://docs.aws.amazon.com/sdk-for-ruby/v2/api/Aws/Translate.html)

“`
require ‘json’
require ‘aws-sdk’

def lambda_handler(event:, context:)

translate = Aws::Translate::Cli

AWS Lambda HTTP APIでPOSTデータを取得・デコードする関数(関数URL対応)

## HTTP APIや関数URLでもPOSTデータを受け取りたい
手軽に実装できてお財布にも優しいHTTP APIですが、POSTデータを受け取るのに一手間必要です。
リクエストbodyはbase64エンコードされた状態で取得できるため、 デコード & jsonパースしてあげる関数を使えばOKです。

## コード
### Node.js
“`getBodyOnLambda.js
function getBodyOnLambda(event_body) {
let body_string_utf8 = Buffer.from(event_body, ‘base64’).toString(‘utf-8’);
//日本語が含まれる場合はdecodeURIする
//decodeURIComponentでは無くdecodeURIなのは、POSTされたデータの中に&が含まれているとJSON変換時にうまくいかないため
body_string_utf8 = decodeURI(body_string_utf8);
//パラメーター形式文字列のJSONへの変