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

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

Lambdaオーソライザで任意のエラーレスポンスを返却する

Lambdaオーソライザで認証結果に応じて
任意のステータスコードやエラーメッセージを返却する方法です。

## 返却可能なステータスコード
ステータスコード 200, 401, 403, 500 を返却することが可能です。

ステータスコードですが通常のLambdaのように直接ステータスコードを
返却することは出来ません。以下の方法でステータスコードを制御します。
・Allow IAMポリシーを返却 → 200 OK レスポンスが返却される。
・Deny IAMポリシーを返却 → 403 Forbidden レスポンスが返却される。
・’unauthorized’トークンを返却 → 401 Unauthorized レスポンスが返却される。
・上記以外のトークンを返却 → 500 Invalid token レスポンスが返却される。

## エラーメッセージのカスタマイズ

403レスポンス返却時は、contextを利用することで対応が可能。
DenyのIAMポリシーの中で設定したcontextオブジェクトの情報は、
ゲートウェイレスポンスにてアクセスすることが可能です。

(例)

元記事を表示

Terraform + SAM で苦労した話

## はじめに

以下のブログを参考に SAM を Terraform に組み込んでみたところ、

色々苦労することになったので備忘録を残します

https://blog.youyo.io/posts/terraform-aws-sam/

## 実行環境

– Terraform: 1.0.6
– Terraform providers:
– aws: 3.58.0
– local: 2.1.0
– null: 3.1.0
– SAM: 1.24.1

## 背景

AWS Lambda のデプロイに昔は apex を使っていましたが、メンテナンスされなくなってしまいました

https://github.com/apex/apex

昔は他に便利なツールもなかったため、
Docker コンテナで依存ライブラリをインストールしてから圧縮するスクリプトを自前で組みました

それを Terraform から呼んで関数毎にビルド・デプロイする方法です

自前実装で長く運用してきたものの、
やはり Lambda 周りが無駄に複雑になってしまっているため、
公式の Lambda

元記事を表示

LocalStack とSAM CLIを用いたローカルLambda +DynamoDB API 作成方法メモ

* LocalStackとSAM CLIを用いたローカルLambda + DynamoDB APIの作成方法についてメモする。
* POSTメソッドでリクエストボディに指定した値をDynamoDBテーブル検索して返却する。

## 構成

![sam+dynamo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/5c881d46-febb-81c6-196c-36d81970d5d9.png)

## LocalStack 準備

* [こちら](https://qiita.com/KWS_0901/items/f9579d9c360cf42dc97d)の手順でDocker LocalStack環境を準備しておく。

## Dynamo DB 準備

* テーブル(`sample-table`)作成

“`shell
aws dynamodb create-table –table-name sample-table –attribute-definitions Attr

元記事を表示

AWS Lambda+Seleniumでスクレイピングする話

# 導入

業務の一環で実行しているスクレイピング。
python + seleniumでツールを作って定時に社内サーバーから自動実行していた。

ある日、設定していた社内サーバーが計画停止。
とりあえずは自分の環境で手動実行してデータは取得したけれど・・・

「技術として汎用性もあるし、これを機にAWS Lambdaへ移動や!」

ということでやってみたのが今回のお話。

# 前提

* 実行環境:AWS Lambda
* 設定環境1:Windows10
* 設定環境2:debian10(権限設定用リモート環境・WSL2とかでもいけるかも)
* 言語:python3.7
* 追加パッケージ:selenium

# コード

AWS Lambdaに配置したソースコードがこちら。

サンプルとしてYahooのプロ野球の順位表から、セ・リーグの順位を抜き出してみた。

https://baseball.yahoo.co.jp/npb/standings/

“` lambda_function.py
from selenium import webdriver
from sele

元記事を表示

Lambda (SAM CLI) + MySQL(docker-compose)を利用した REST API作成方法メモ

* ローカル環境でLambda(SAM) + MySQL(docker-compose)を利用したAPIを作成する方法についてメモする。

## AWS SAM(Serverless Application Model)

* サーバーレスアプリのデプロイに特化したCloudFormationの拡張機能。
* YAMLもしくはJSONでリソース定義する。

### SAM CLI

* SAMを利用した開発サポートツール
* サーバーレスアプリのひな形作成、ビルド、AWSへのデプロイができる。
* 開発者のローカル環境でLambdaをDockerコンテナ起動できる。

## 構成

![sam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/28ba6b48-16b7-3127-3657-9604cc31e631.png)

## 準備

* SAM CLIインストール

“`shell
brew tap aws/tap
brew install aws-sam-cli

元記事を表示

CloudWatchのアラートをSNS経由でLambdaを実行し、Slack通知

#はじめに
今回はメモ書き程度になります。
題名の通り、構築していきます。

`Webhook URL`をKMSで暗号化する場合は、下記の記事通りにできます。
[【AWS】CloudWatchアラーム通知をLambdaでSlack投稿する](https://www.geekfeed.co.jp/geekblog/aws_cloudwatch_to_slack/)

ただ、KMSはお金がかかりますし、それほどセキュリティー対策が必要なければ、Lambdaの環境変数に、`Webhook URL`を設定します。

その場合のコードのみ参考記事とは異なりますので、コードを記載しておきます。
また、参考記事の①KMSを作成、②IAMを作成は不要です。

#コード
環境変数
`slackChannel`:`slackのチャンネル名`
`hookUrl `:`Webhook URL`

“`python
import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.reques

元記事を表示

【AWS】ElasticTranscoderで動画変換する仕組みを構築する

## はじめに
今回、弊社運動通信社で開発しているスポーツブルアプリの中のスーパープレイ動画機能の裏側について少しご紹介させていただきます。
スーパープレイ動画機能とは様々な競技のスーパープレイの部分を切り取った縦型の動画集をスワイプしながらザッピング感覚で閲覧できるものです。

↓動画は以下のように縦型フルスクリーンで閲覧できます。
![tatefuluのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/a8d702b9-f20b-328a-ce02-4bf45c08d7bd.png)

ザッピング感覚で閲覧できるようにする上で通信環境の考慮が必要となってきます。
通信環境によって読み込み時間が長いと体験が損なわれてしまうため、通信環境に応じた複数ビットレートの動画を用意し、その点を解決しました。
具体的にはAWSのElasticTranscoderを使ってその仕組みを構築してみましたので、事例としてご紹介したいと思います。

## 構成イメージ
ざっくりした構成と処理の流れはこ

元記事を表示

APIGatewayとStepFunctionを使い、EC2の起動から停止時間までを自在に操る

#はじめに
「EC2を起動し、特定の時間経過後、EC2を停止する」仕組みをAPIGatewayとStepFunctionを使い、実現します。

#完成図
`https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/start-limit?instance_id=i-hogehoge&time=10`をリクエストすると、インスタンスIDが`i-hogehoge`のEC2を起動し、`10`秒後に停止する挙動になります。

**挙動の詳細について説明しますと、**
起動するインスタンス`instance_id`で指定し、と起動してから停止するまでの時間を`time`で指定しています。

APIGatewayからこれらの2つの値をStepFunctionに渡し、StepFunction内で、Lambdaに`instance_id`、とWaitに`time`を渡して実行する挙動になります。
S3へのレプリケーションをトリガーにLambdaのコード更新・新規バージョン発行を実行する

## 以下の記事を参照して頂ければと思います

https://note.com/shift_tech/n/nbe12fc8d8df7

**※ Qiitaの記事は全て個人的な記載であり、所属する組織団体とは無関係です**

## 補足
ソースコード全体は以下です。

https://github.com/yuta-katayama-23/lambda-update-function-code

元記事を表示

around_actionで引数ありのメソッドをlambdaで指定する

## 概要

`around_action`に引数を持つメソッドを指定する際に無限に詰まったので同じ状況で困っている人のために残しておく。(最終的に上司に助けていただいて解決した。)

指定方法だけ知りたい人は`解決`までジャンプしてもらえれば書いてある。

## 状況

なぜ詰まったかというと、まずrailsでAction Controllerのフィルターを使用する際に引数を持つメソッドを指定する場合、ブロックを渡す必要がある。下記のようにしないとエラーが出てしまう。

“`rb
class HogeController < ApplicationController # 引数なしの場合 before_action :fuga # 引数ありの場合 before_action -> { fuga(x, y) }
end
“`

`before_action`と`after_action`を使用する場合は上記の記述で問題ないけど、`around_action`を使用する場合は1つ問題が発生する。

Railsガイドを読むと下記のように記述がある。
>「around系」

元記事を表示

LocalStackを使ってローカル環境でS3を立ち上げ、Lambdaでファイルをアップロードしてみた

# この記事について

AWSのサービスをローカルで実行できるLocalStackについて紹介したいと思います。今回、AWS CLIの練習も兼ねてLocalStackを使用し、ローカルでAWS LambdaとS3を立ち上げ、Lambda関数を使用し、S3に日時.txtファイルをアップロードしてみました。

# 記事の対象者

– LocalStackに興味のある方
– AWS・AWS CLIに触れてみたい方

# LocalStackとは

開発環境において無料で**AWSのアカウント登録なし**でAWSのサービスを擬似的に使用できるモックフレームワークでpipやdockerを用いて簡単に環境構築が可能。
ローカルにAWS環境を作ってくれて、料金などを気にすることなくテストや動作確認が可能である。

https://localstack.cloud/

LocalStackは無料版と有料版がある。[^abe] 有料版は無料版に加え、高度なサービスをサポート。以下にLocalStackのサービスを示す。[^abc](2021年10月時点)

| 無料 | 有料

元記事を表示

大量にあるLambda Functionsのトリガーとの紐付き一覧を出力する

Lambdaって便利でついつい量産しちゃいますよね。
負債は負債として、量産してしまったLambda関数を整理する際に、どのトリガーから起動する設定になっているかを出したくなった際のエントリーになります。

トリガーを見れば、どのLambda関数がもう不要なのかの当てが付くかなと思い。

## 環境
“`bash
$ sw_vers
ProductName: macOS
ProductVersion: 11.5.2
BuildVersion: 20G95
$ uname -mrsv
Darwin 20.6.0 Darwin Kernel Version 20.6.0: Wed Jun 23 00:26:27 PDT 2021; root:xnu-7195.141.2~5/RELEASE_ARM64_T8101 arm64
“`

## aws-vaultのセットアップ
本エントリーでは認証情報を直接ローカルに保存する`aws configure`ではなく、`aws-vault`を利用します。

“`bash
$ brew install aws-vault
$ aws-vault

元記事を表示

AWS LambdaにJava11のプログラムをデプロイし、パラメータストアから値を取得するメモ

### パラメータストアに適当なキーを保存
– キー名:testkey
– 値:test-value

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530708/eaad3e6f-0cfe-83bd-d7f5-66f767ed4d28.png)

### ラムダ上に関数をデプロイして実行
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530708/0af6dfb2-917e-5c14-836c-92e720fb198a.png)

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530708/e6835c85-5c1d-bc31-fc9e-e05e8a704040.png)

### ソース作成からデプロイまで
– sam initでテンプレートを作成(AWS Quick Start

元記事を表示

Lambda が保留中のままタイムアウトするエラーの原因

# はじめに

Lamba のエラー通知を受信したので X-Ray で確認すると、Lambda の状態が「保留中」となったまま実行時間を過ぎてタイムアウトしまいエラーになっていることがありました。その原因がわかったため、ここに記録しておきます。

# 原因

このエラーは、[VPC](https://aws.amazon.com/jp/vpc/) 内のプライベートサブネットに接続する必要がある Lambda に起こるようです。

Lambda が VPC 内のリソースに接続するとき、サブネットごとにネットワークインターフェイス([ENI](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html))が作成されます。これによって Lambda は各 VPC 内のリソースに通信できるようになります。

この Lambda が長期間アクティブでない場合、Lambda はネットワークインターフェイスを回収し、アイドル状態になります。アイドル状態の Lambda を再度アクティブにするには、その Lambda

元記事を表示

API Gateway + Lambda でリダイレクトする方法(Go言語)

# 目的
API Gateway + Lambda でリダイレクトさせたいときの Go 言語のコードを紹介します。

# リダイレクトさせる Go 言語のコード

APIGatewayProxyResponse は、リクエストに対して API Gateway によって返されるレスポンスを構成します。よって、APIGatewayProxyResponse にリダイレクト(3xx)のステータスコードとリダイレクト先 URL をセットしてあげれば、クライアントにリダイレクトさせることが可能です。

“`golang
package main

import (
“net/http”

“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
)

func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
return events.APIGatewayProxy

元記事を表示

日経平均のチャート画像を毎日Twitter投稿するLambda関数(Rust)を作る

##はじめに
スクレイピングした日経平均のチャート画像を毎日Twitter投稿するLambda関数をRustで作成しました。

##成果物

– GitHub:https://github.com/c3drive/my_stock_data
– 成果物:https://twitter.com/idx_info

##環境など

– 実行環境:AWS Lambda (カスタムランタイム) + Amazon EventBridge + AWS S3
– 開発言語:Rust
– 開発環境:macOS + VSCode + AWS SAM + (Docker)
– 株価チャート取得先:[StockCharts.com](https://stockcharts.com/)
– Twitter投稿:[TwitterAPI](https://developer.twitter.com/)
– 構成図作成: Python + [diagrams](https://diagrams.mingrammer.com/) + graphviz

##概要
やっていることは以下です。

– Amazon Eve

元記事を表示

【AWS Lambda】Slackに通知を送信する

今回はCloudFormationでLambdaを触ってみるということで、Slackに通知を送信するLambda関数を構築していきたいと思います。

調べてみたところ、Lambdaを構築する場合はCloudFormationの `AWS::Serverless` というマクロ機能を利用するみたいです。
[AWS::Serverless変換](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html)

マクロを利用すると「AWS SAM 構文」なるものでLambdaを定義できるようになり、 `aws cloudformation package` コマンド実行時に、通常のCloudFormationテンプレートに展開されます。

マクロ機能を利用するには、テンプレート内で下記のように宣言します。

“`template.yml
Transform: AWS::Serverless-2016-10-31
“`

# SlackのWebhook U

元記事を表示

AWS SAM+Lambda+Go+WSLではじめるサーバーレスアプリケーション開発

# 目的

AWS SAM を使って Go 言語でサーバーレスアプリケーションを開発するための、環境構築の手順をまとめます。個人的な備忘録を兼ねているため、必須ではない細かな設定なども記載しています。Lambda でサーバーレスアプリケーションの開発をはじめようと思っている方の参考になれば幸いです。

# 当記事に含まれる内容

当記事に含まれる内容は下記の通りです。ソフトウェアのインストールなどは既にわかりやすい記事があるので、そのリンクを貼っています。

– Hello World アプリケーションについて
– WSL2 の設定
– Docker の設定
– AWS CLI の設定
– Session Manager プラグインの設定
– SAM と Go のインストール
– Ubuntu の環境変数設定の自動化
– VSCode の設定
– SAM プロジェクトの新規作成
– SAM プロジェクトのデプロイ
– AWS コンソールから各サービスを確認

# Hello World アプリケーションについて

Hello World アプリケーションは、SAM プロジェクトを新規作

元記事を表示

AWS SAMでLambdaに設定したS3イベントトリガがコンソールに表示されない問題の対応

AWS SAMでLambdaにS3イベントトリガを設定したところ
動作は想定どおり行われるが、AWSコンソールのイベントトリガには
何も表示されない事象が発生しました。

これは既知の問題のようで
https://github.com/aws/serverless-application-model/issues/300
で議論されていました。

上記にも記載されていますが対応方法のサンプルです。

最初の定義。以下ではAWSコンソールにイベントトリガが表示されない。

“`yaml
MyFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: MyFunction/
Runtime: python3.8
Handler: app.handler
FunctionName: !Sub
– “${prefix}MyFunction”
– { prefix: !FindInMap [“EnvMap”, !Ref Env,

元記事を表示

React+AmplifyにContent-Security-Policy-Report-Onlyを設定しCloudWatchにログをためる話

##背景
業務で開発しているReactアプリの中で、XSSの対策としてContent-Security-Policyの設定を行うか議論があり、
そのための判断基準を設けるために一旦、Content-Security-Policy-Report-Onlyを設定してレポートを収集して分析を行う流れになった。

##Content-Security-Policy(CSP)とは
[簡易な認識] : XSS対策の一環で、HTTPのヘッダーの中にそのサイトで使用するJSのスクリプトやコンテンツ、画像やフォントなどを読み込む場所をホワイトリストとして設定することで
それ以外の場所から読み込まれるものはブロックするもの。

詳しい内容はいろんなサイトが紹介している

https://developer.mozilla.org/ja/docs/Web/HTTP/CSP

##Content-Security-Policy-Report-Onlyとは
Content-Security-Policyを設定するとブロックされたものは表示できなくなり、変に設定するとアプリとして壊れるかもしれない。
そこでCSP

元記事を表示

OTHERカテゴリの最新記事