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

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

S3バケットにあるgzipファイルを加工して再度gzipで出力

大したことない作業のようですが、若干つまりどころがあったので残しておきます。

## やりたいこと
とあるS3バケットにあるgzipファイル(中身はjson)が生成されるたびに一部加工して、別のバケットに再圧縮して出力したい。
図を書くほどのものでもないんですが、こんな構成になります。
![Blank diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/6b84716b-cd55-0cff-954b-e9ba1f9df0f3.png)

## どうやるか
Source BucketからSQSに通知してLambdaを呼び出すところは一般的な設定なので割愛します。
gzipを取り扱えるnpmパッケージは有名どころだと[node-zip](https://www.npmjs.com/package/node-gzip)などがありますが、zlibだけで出来ましたので今回のようなシンプルなケースだと外部パッケージは不要でした。
解凍・加工・再圧縮を行うLambdaは下記のようにな

元記事を表示

40 代おっさんLambdaを使ってみる

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## lambdaを使う

lambdaの作成画面に行ってください。

作成を押してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/85ca853c-5b13-9ada-3d44-f0b5f629862b.png)

左から

・一からの作成

・設計図の使用
あらかじめAWSで設計されているもの使用できる

・コンテナイメージ

・Serverless Application Repository

### 設計図の使用を選ぶ

hello-world-pythonと入れる

テンプレートが表示されるのでチェックボックスにチェックを入れて、左下の設定をクリック

### 関数名に名前を入れる

関数名をhello-pythonにしました(わかる名前で

元記事を表示

lambdaをローカルで動かしてみよう

今回はlambda上に実装したアプリケーションをローカルで動かす方法を紹介します。
言語はpython3.8です。

## この記事の流れ
1. AWS SAM CLI のインストール
2. アプリの作成(lambda)
3. ローカルで挙動確認

## 1. AWS SAM CLI のインストール
下記、リンクを参考にインストールを行なってください。
[AWS SAM CLI のインストール](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)

## 2. アプリの作成(lambda)
ターミナルを立ち上げ、lambdaのプロジェクトファイルを作成するディレクトリに移動して下記コマンドを実行してください。

“`zsh
sam init
“`

 SAMテンプレートの作成が始まり、いくつか選択を要求されますので、下記を選択をしてください。
 ・ 1 – AWS Quick Start Templ

元記事を表示

CloudWatchAlarmの発砲テスト方法

# これは何?
CloudWatchAlarmからSNSへ連携されてLambdaがトリガーされる仕組みを作っていたのですが、
アラート発生のテストで毎回CPU使用率を上げるなど面倒だったが簡単な方法を見つけたのでメモです。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/US_AlarmAtThresholdEC2.html#cpu-usage-alarm-cli

https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/set-alarm-state.html

## CloudWatchAlarmテストコマンド
``をテストしたいCloudWatchAlarm名に変更して実行します。

“`
aws cloudwatch set-alarm-state –alarm-name –state-value ALARM –state-reason “test”
“`

##

元記事を表示

Lambda/SAM ログ出力方法 メモ

* Lambdaでのログ出力をsam cliを使って試したのでメモとして残しておく。

## 事前準備

* sam プロジェクト作成

“`shell
sam init
“`

※ランタイムはPython3.8を選択。

## コード

* `template.yml`

**ログレベル**を環境変数として設定する

“`yaml

Environment:
Variables:
LOG_LEVEL: !Ref LogLevel

Parameters:
LogLevel:
Type: String
Default: INFO
“`

* `app.py`

“`python
import json
import logging
import os
import requests

def lambda_handler(event, context):
logger = logging.getLogger()

# ログ

元記事を表示

40 代おっさんLambdaのイベントソースとlambda関数を学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## イベントソース

### イベントソースとは

lambda関数が呼び出されるきっかけとなるもの
lambda関数にはハンドラーなるものがあり、それでイベント受け取る

#### lambda関数を呼び出すタイプ

・同期
・非同期
・ストリーム
がある

イベントソースにより呼び出しのタイプが異なる。
それにより、aws側でリトライを実行されるのか、ユーザー側でリトライを実装するのかで変わる

## 最後に

またこの記事は AWS 初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。

元記事を表示

amplifyで発生した Export EXPORT_NAME cannot be updated as it is in use by STACK_NAME の対処

# amplifyで発生した `Export EXPORT_NAME cannot be updated as it is in use by STACK_NAME` の対処

– amplify cli version: 7.6.3
– AWSコンソール操作 : 2022/03/05 時点

amplify pushをしたところ以下のエラーが発生した

“`markdown
Export EXPORT_NAME cannot be updated as it is in use by STACK_NAME
“`

このメッセージ単体だけで調査したところAWSの以下の記事が引っかかるが、解決の方法の一部でしかなかったので対処方法を残す。

[https://aws.amazon.com/premiumsupport/knowledge-center/cloudformation-stack-export-name-error/?nc1=h_ls](https://aws.amazon.com/premiumsupport/knowledge-center/cloudformatio

元記事を表示

40 代おっさんLambdaの概要、料金、主な連携サービスを学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## Lambda

### Lambdaとは

サーバーレスコンピューティングサービス
サーバーなしでコードを実行できるサービス

#### サポートしている言語

Java,Go,PowerShell,Node.js,C#,Python,Ruby

#### メリット

・基盤となるインフラに依存せずコードを実行
・イベントに応じてコードを実行する
・自動スケーリング
・エッジで実行可能

### 料金

リクエスト数と実行時間で決定

#### 無料枠

リクエスト数:100万件まで無料
実行時間:40万GB-秒まで無料

#### 課金

リクエスト数:100万件あたり0.20USD
実行時間:GB-秒あたり0.0000166667USD
(メモリ1GB割り当ての場合)

### lambdaに連携できるサービス

・Cognito:ウェブアプリケーションおよびモバ

元記事を表示

SAMで構築したLambdaのエラーをSentryに通知する

# 概要

AWS SAM(AWS Serverless Application ModelにてStepFunctionsを利用したバッチを作成しています。
各Lambdaで発生した例外をSentryへ通知したかったため、調べてやってみました。

共通的にソースコードを変えずに設定する方法が見つからなかったので、
1つ1つのLambda handlerのソースを修正する方法になってしまいました。
※知っている方いたら教えてください。

# 設定方法

まずはSentryにてプロジェクトを作成しdsnを取得してください。

次に[公式](https://docs.sentry.io/platforms/node/guides/aws-lambda/)にも書いている通り@sentry/serverlessを追加します。
(Lambda Layerを使用することもできます。詳しくは後述)
“`sh
yarn add @sentry/serverless

or

npm install –save @sentry/serverless
“`

実際のソースコードへSentryへの通知設

元記事を表示

jest.mock + prototypeでDynamoDBをMock化した

# そもそもやりたかったこと
SQSから受け取ったメッセージを lambdaで加工し、
その情報を使ってDynamoDBからItemをGet、指定のURLへItemの内容をaxiosを使ってPostする仕組みを作っていました。

テストコードを記述するにあたり DynamoDB.DocumentClient.get部分をMock化したいと思いました。
ググると[aws-sdk-mock](https://www.npmjs.com/package/aws-sdk-mock) とか、[aws-sdk-client-mock](https://www.npmjs.com/package/aws-sdk-client-mock)とか情報が出てくるのですがうまくMock化できず詰まりました。
aws-sdk-client-mockはそもそも使っているAWS SDKがv2だったので使えなそうと思い断念。

最終的に jest.mock + JavaScriptのprototypeの組み合わせでうまく行ったので、備忘のため記述します。

# 環境
lambda: typescript(4.1.3)

元記事を表示

AWS LambdaからTwilio Functionsに値を渡す

# これはなに?
AWSLambdaからTwilio Fnctionsへ値を渡すときに使用した例です。

例えばですが、CloudWatchAlarmの発生をトリガーにLambdaが動き、
LambdaからTwilio Functionsが呼び出されSMSの通知内容でアラート名をお知らせするなど行えると思います。

## Lambda側
下記にて紹介されているコードを転用して作成しております。
今回はCloudWatchAlarmよりアラートが上がった際のアラート名を連携するようにしています。

https://qiita.com/mobilebiz/items/406461282a23d2e056a6#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%BA%96%E5%82%99

“`index.js
exports.handler = function (event, context, callback) {
const crypto = require(‘crypto’);
const

元記事を表示

別のLambdaを同時に呼び出して実行する方法【備忘録】

## 背景
Lambdaを使って日付ごとにデータをスクレイピングすることがあった。
大量のデータであったが、繰り返し文で日付を変えながら行うプログラムとしていたため、非常に時間がかかった。

そこで、①実行指示Lambdaと②スクレイピングLambdaに分けてプログラムを作成し、①にて変数を入れ替えながら②に指示するような構成にすることで、Lambdaの同時実行が可能になったので、備忘録として記載する。

参考記事については複数層に分けて大量のLambda実行を可能としているが、今回はわかりやすさ優先で、(親)と(子)の2層構造でLambdaを同時実行してみる。

## イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/49578015-605e-e696-d64f-c0bab0855d94.png)

## 親Lambda

“`Python:parent

import json
import io

client = boto3.client(‘lambda

元記事を表示

Docker+AWS Lambdaのローカルテスト環境を作成する

## 概要

Lambdaのローカルテスト環境をDockerで作成しました。本記事ではPythonで書いています。
公式ドキュメントを読んでも上手くいかなかったので、記事にします。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html

## 用意するもの

– Dockerコマンドを実行できる環境

## 構築手順

### ディレトリ構成

“`
(プロジェクトルートディレクトリ)/
├── Dockerfile
├── requirements.txt (不要なら作成しなくて良い)
└── app.py
“`
### ファイル作成

“`Dockerfile:Dockerfile
FROM public.ecr.aws/lambda/python:3.8

COPY app.py ${LAMBDA_TASK_ROOT}
COPY requirements.txt .

RUN pip3 install -r requirements.txt –target “${LAMBDA_TA

元記事を表示

Presigned URLの発行と取得したURLを使用して画像ファイルをGET/PUTする。

## 目的
コンテンツをサーバー上にアップロード・ダウンロードして配信するというユースケースがある。コンテンツを保持しておくサービスとして、AWSにS3というサービスがあるのでそれを利用する。

## 環境
– AWS Lambda Python 3.9

## Lambdaコード
“`python
# — coding: utf-8 —
import boto3
from botocore.client import Config
import os

REGION_NAME = os.environ[‘REGION_NAME’]
S3_BUCKET_NAME = os.environ[‘S3_BUCKET_NAME’]
DURATION_SECONDS = os.environ[‘DURATION_SECONDS’]
KEY_NAME = os.environ[‘KEY_NAME’]

s3 = boto3.client(‘s3′, config=Config(signature_version=’s3v4’))

def lambda_handler(event, cont

元記事を表示

LambdaPermissionとは何か

# はじめに
Former2でCloudformationテンプレートを作っていたらLambdaPermissionなるものが生成された。
“`yaml
LambdaPermission:
Type: “AWS::Lambda::Permission”
Properties:
Action: “lambda:InvokeFunction”
FunctionName: !GetAtt LambdaFunction.Arn
Principal: “apigateway.amazonaws.com”
SourceArn: “**************”
“`
身に覚えがないぞ。

# 結論
* コンソールから手動で作成するときは自動で生成されるもの。
* Lambda関数にトリガーをセットする際、トリガーからのInvocateを許可するリソースベースポリシー。つまりこいつがないとトリガーが機能しない。

## 公式を確認
_The AWS::Lambda::P

元記事を表示

Cloud Watch Alarm + SNS + LambdaでECS・Fargateのリソース状態をSlack通知する(Terraform)

# 本要件の流れ

1. Cloud Watch Alarm発動
2. SNSへメッセージを送信
3. トリガーを検知しLambdaが起動
4. LambdaからSlackへ通知を送信

# 前提

– ECSでなにかしらのアプリケーションを構築済み

# Webhookの取得

まずは実装の前にwebhookが必要なので、事前設定を行います。

[https://slack.com/apps](https://slack.com/apps) へアクセスし、

アプリを検索する > カスタムインテグレーション > Incoming Webhook

で設定の編集を行い、webhookを追加するslackのチャンネルを登録してください。

するとwebhookのurlが発行されるので、それを控えておきます。

「対象のチャンネルにWebhookを追加し、URLを取得する」ということができれば良いです。

色々と記事は出回っているのでググってもらえれば助かります。

# 実装

最初に取得したwebhookのurlは変数で渡せるようにしておきましょう。

develop/variables

元記事を表示

Lambda(Node.js)で別アカウントのECSサービス情報を取得する

# はじめに
Node.jsを使ってスイッチロールして別アカウントのECS情報を取得する際に実装方法が分からなかったので、備忘として残しておきます。
Lambda+Node.jsの情報少なすぎひん…?

# 設定内容
## 権限設定
Lambdaを作成する前に以下の設定だけ先にやっておきます。
色々試しながらだったので、もしかしたら漏れがあるかもしれません。

* アクセス元のIAMロールにAssumeRole権限追加
* アクセス先のIAMロールにECSへのアクセス権限追加(ECSFullAccess)
* アクセス先のIAMロールの信頼関係にアクセス元のIAMロールを追加

## Lambda実装
初めてNode.js書くので不要な実装とか含まれているかもしれませんが、実際に実装したプログラムは以下です。
普段Pythonしか書かないのでcallbackとか全然頭に入ってこなかった。。

“`
const AWS = require(‘aws-sdk’);
const sts = new AWS.STS({apiVersion:’2011-06-15′,region:’ap-

元記事を表示

Amplify Lambdaのトリガーでミスした件

# Amplify Lambdaのトリガーでミスした件

## はじめに
Amplify CLIでS3にLambdaトリガーを設定した際に、トリガーが永続的に発火しLambdaの請求額が上がってしまったので再発防止+覚えておくように書きます。

## 概要
AWS Amplifyで開発をしています。以下に簡単な概要を記述します。
クライアントは、ある特定のファイルをAmplifyで作ったStorage(S3)にプットします。それと同時にAPIでDynamoDBにレコードを挿入します。

この際にS3にプットされたファイルオブジェクトが正しいデータが否かを確認するためにLambdaトリガーをAmplifyで設定します。

このLambdaはDynamoDBにそのファイルのデータがあるかを確認し、あればそのままファイルをS3に保存し、ない場合はそのS3オブジェクトを削除するというものです。

## ループまで
Amplify cli で storageにトリガーを設定し、プッシュしました。

“`
$ amplify update storage

Select from one of

元記事を表示

Lambdaでデプロイしたのに反映されない?と思ったらエイリアスを確認

# Lambdaのデプロイが反映されない
最近ジョインしたプロダクトの開発環境にて、修正したLambda関数をサクッと確認してみようとしたところ「あれ? デプロイしたのに反映されていない……?」となったので以下対応メモします。

## 事象
既にCloudformationその他で構築され問題なく動作しているAWS環境にて、Lambdaのソース(Python3.7)を修正して動かしてみたところ、明らかにソースが反映されていない(修正前のコードで動いている)という事象が発生。

デプロイのやり方としてはとてもシンプルで、Lambdaのチュートリアルとかでもよくある「コンソール画面でソースを修正して、『Deploy』クリック」するという方法。

↓画像の「Deploy」をクリック
![コメント 2022-03-01 124222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319998/682df768-17c0-ce83-1a31-41595d982b29.png)

その後別のデプロイ方法(zipフ

元記事を表示

AWS Lambda(Python)から直接画像を出力する方法(覚書)

# SVGを出力したい

特に何も考えずに `Content-Type` だけしっかり指定してあげればOK。

“`Python
return {
‘statusCode’: 200,
‘headers’: {
‘Content-Type’: ‘image/svg+xml’,
},
‘isBase64Encoded’: False,
‘body’: ‘svg version=”1.1″ xmlns=”http://www.w3.org/2000/svg”>…’,
}
“`

# PNGを出力したい

こっちが主題になります。
Pythonで画像を取り扱う場合、何らかのライブラリを使用することになると思いますが、今回はおそらく一番使われてるであろう[Pillow](https://github.co

元記事を表示

OTHERカテゴリの最新記事