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

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

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

元記事を表示

作業先のS3バケットがLambdaのトリガーとなっていないかを確認する方法

#背景
S3へのオブジェクト作成をトリガーを利用してLambdaを活用することは多いと思います。
そうすると、S3にファイルを作成する処理を書くときに

「あれ、このバケットのこの場所、トリガーになってないよね、、、?」

と思うことが出てきました。
さっと確認できると安心感も増すものです。

#解決方法

API レベル (s3api) コマンドにこれを満たす get-bucket-notification-configuration というものがあります。

参考:[API レベル (s3 api) コマンド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-apicommands.html)

#具体的な方法
せっかくなので
・S3の条件(Prefixとか)
・S3のパス
・Lambda関数のARN

が1行で一覧で出力できるようなjqを書いてみました(あと一歩スマートな書き方があるかもです)

“`
aws s3api get-bucket-notification-config

元記事を表示

[AWS Step Functions] EC2とRDS(Aurora)をグループ単位かつ指定した順番に起動/停止する

## はじめに

EC2とRDS(Aurora)を、グループ単位かつ指定した順番に起動/停止する仕組みを AWS Step FunctionsとLambda(Python 3.9)で作りました。

## もう少し詳しく

作成した StepFunctions ステートマシン の詳細を説明します。
以下のように複数のEC2,RDS(Aurora)がある場合に、タグを使いをグループ化と起動順序を設定します。
タグに必要な情報を設定し、起動したいグループと命令(起動命令 or 停止命令)を指定すると、順番に従いリソースを起動or 停止します。

具体的な設定例も含め説明します。以下図のような構成でEC2,RDS(Aurora)を作成します。


※図にはリソースごとのタグ情報を記載しています

各リソースにはこのようにタグを設定します。

元記事を表示

LocalStackを用いたAPI Gateway+Lambda+DynamoDB API作成方法 メモ

* LocalStackを用いて、DynamoDBにデータ登録を行うAPIをAPI Gateway + Lambdaで作成する方法についてメモする。

## 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 AttributeName=Data,AttributeType=S –key-schema AttributeName=Data,KeyType=HASH –provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 –endpoint-url=http://localhost:4

元記事を表示

LocalStackを用いたS3オブジェクト登録API(API Gateway+Lambda)作成方法 メモ

* LocalStackを用いて、S3バケットにオブジェクト登録を行うAPIをAPI Gateway + Lambdaで作成する方法についてメモする。

## LocalStack及びS3 準備

* [こちら](https://qiita.com/KWS_0901/items/f9579d9c360cf42dc97d)の手順でLocalStackとオブジェクト登録先のバケット(`sample-bucket`)を準備しておく。

## API Gateway 準備

* REST API を作成する

* リソースID(`id`)を控える

“`shell
aws apigateway create-rest-api –name ‘LambdaS3TestAPI’ –endpoint-url=http://localhost:4567 –region us-east-1 –profile localstack
{
“id”: “A-Z2699261A-Z3”,
“name”: “‘LambdaS3TestAPI'”

元記事を表示

API Gateway POSTメソッド+Lambda 作成の備忘

##構成

[Client] ⇒(リクエスト ※1)⇒ APIGateway ⇒ Lambda

※1
 IAM認証・・・不正リクエスト対策
        ※Client PCがウイルスにかかり、APIにリクエストが動く場合など
 IP制限 ・・・不正アクセス対策

##POSTのAPI リクエストのcontent-type
世の中のAPIを見ると、リクエストのcontent-typeが、
application/jsonのものと、application/x-www-form-urlencodedのものがあります。
両方に対応しているAPIもありました。
application/jsonの数が増えつつあるというところでしょうか。

“`x-www-form-urlencoded.
flg=1&id=2
“`

“`application/json.
{“flg”:1,”id”:2}
“`

##API Gatewayの設定について
####・リソースポリシーで、IP制限を設定
https://aws.amazon.com/jp/premiumsupport/knowledge

元記事を表示

AWS Step Functions のステート定義におけるリトライの書き方

## 指数バックオフアルゴリズム  
SFN(Step Functions) は指数バックオフによるリトライが行われます。
(エクスポネンシャルバックオフ)

https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html

SFNにおける式はこんな感じ
`リトライ時間 = IntervalSeconds * BackoffRate ^ (Attempts-1)`

https://d1.awsstatic.com/webinars/jp/pdf/services/20190522_AWS-Blackbelt_StepFunctions.pdf#page=36

簡単に言うと、回数を追うごとに待ち時間が長くなっていくようなリトライアルゴリズムです。

いきなりこんな式を見てもピンと来ないので、エラー時に成功するまでn回リトライするようなケースを考えてみます。

### よくあるリトライ
* `リトライ間隔 = 2秒` (固定)
* `リトライ回数 = n回`

サーバーレスフレームワークでLambdaからLaravelを利用してRDSに接続する(検証手順付き)

以下に移行しました。

https://zenn.dev/mgmgmogumi/books/0214f64645951a

元記事を表示

OTHERカテゴリの最新記事