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

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

【Python】importが必要なPythonをAWS Lambda へ移行してみた 事前準備編

#はじめに
昨日、macOSのcronで自動実行するためにmacOSの省電力モードをOFFにすると1ヶ月で1,200円程度電気代がかかるのでは!?という記事を書きました(あくまで試算です)

https://qiita.com/hirockio2206/items/2ce4fcac798a21ad40b4

やはり、オンプレ運用はよくないと。これからはクラウドっしょ!
ただ、AWS Lambdaってよくわからん。
って思っている方いますね?(私)

ってことで本日はAWS Lambda へPython実行環境を移行にチャレンジしてみました。
少し長くなるので、事前準備編とAWS編で分けて投稿します。

#環境
・既にAWSのアカウントを持っている(お持ちでない方でもすぐ発行できますよ。)
・Python3.9
・macOS Catalina10.15.7
・定期実行したいpythonがある

#事前解説
今回はサンプルとして、ccxtという複数の仮想通貨取引所のAPI操作が集約されたライブラリをAWS Lambdaで実行したいと思います。

AWS Lambdaにはデフォルトではccx

元記事を表示

AWS lambda@Edge単体テスト(イベントテンプレート)

AWS lambdaを書く時、いちいちデプロイしてテストしてました。

実際どういうリクエストが来るかはある程度イベントテンプレートでまかなえるようです。
lambda@edgeを書いていて、デプロイなどがとても面倒でしたが、これでかなり進みました。

以下の画像は`cloudfront-normalize-querystring-to-improve-cache-hit`というテンプレートです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/00c80761-4629-87d1-e7fb-5760718bea81.png)

単純にCloudfrontにGetリクエストが来たような感じですかね

“`
curl https://[CFドメイン]/test?size=LARGE&color=RED
“`

実際に受け取るeventと比較してキー名などは一致してるみたいなので、使えそう.

もしCookieをつけるなら以下のようなものを`headers`ブロックに追

元記事を表示

AmplifyにてLambdaへAPIコールするときにリクエストパラメータが受け取れない

# 結論
GETリクエストするときは、リクエストボディではなくクエリストリングかパスパラメータを使いましょう。

# ハマったこと

クライアント側はこのように呼び出し(ちなみにReactです)

“`react:apiCall.tsx
import { API } from “aws-amplify”;

export const hoge = async (
hogeId: string
): Promise => {
const apiName = “hogeAPI”;
const path = “/”;
const params = {
body: {
hogeId: hogeId,
},
};
return await API.get(apiName, path, params);
};
“`

Lambda側ではこのように受け取り

“`js:lambda.js
exports.handler = async (event) => {
const parameter = JSON.parse(even

元記事を表示

CloudFrontでS3の署名付きURLを発行する

CloudFrontでS3の署名付きURLを発行する方法です。

## 暗号鍵、公開鍵の生成
“`bash
openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -in private_key.pem -out public_key.pem
“`

## CloudFrontキーグループに公開鍵の追加

ここはAWSコンソールで作成するだけなので割愛します。

## SecretsManagerに暗号鍵を登録

今回、作成した暗号鍵はシークレットキーに保存し、Lambdaから取得します。
AWSコンソールを利用して暗号鍵を貼り付けると値がおかしくなるようなので
AWS CLIを利用し登録します。

“`bash
aws secretsmanager create-secret –name <シークレット名> –secret-string file://private_key.pem –region ap-northeast-1
“`

## 署名付きURLの発行(Lambda)
“`python
imp

元記事を表示

Cloudformation + Lambdaで環境変数にパラメータストア-SecureString-の値を設定する

LambdaProjectを新設したので、デプロイ周りを構築中。
環境変数をパラメータストアから取得しようとしたら・・・

“`
SSM Secure reference is not supported in: [AWS::Lambda::Function/Properties/Environment/Variables/ENV_NAME]
“`
なん….だと?

[公式ドキュメント](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#template-parameters-dynamic-patterns-resources)を見ると。

> Resources that support dynamic parameter patterns for secure strings
Resources that support the ssm-secure dynamic reference pattern currently include:
– AW

元記事を表示

Amazon EventBridgeでAWS Lambda関数を定期実行させてみた。

#はじめに
以前バッチアプリをLambdaへアップロードしたのですが、今回はAmazon EventBridgeと組み合わせて定期的に実行させてみました。

https://qiita.com/Ooooooomin_365/items/9f28e15608736e92b9ff

##EventBridge設定手順
定期実行させたいLambda関数を開き、”設定” > “トリガー”を開きます。
赤枠で囲っている”トリガーを追加”をクリックします。
![eventbridge1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/f84f1e16-889d-e97e-0e78-6efc7ecbea5f.png)

“トリガーを追加”画面が表示されるので「EventBridge」を選択します。
![eventbridge2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/56f34b03-190d-99a3

元記事を表示

以前リファクタリングしたスクレイピングバッチアプリをAWS Lambdaへアップロードしてみた。

#はじめに
以前リファクタリングしたこちらのスクレイピングバッチアプリを今回はAWS Lambdaへアップロードしてみました。
今回はその手順を備忘録として残しておこうと思います。

https://qiita.com/Ooooooomin_365/items/3520e8b58b853300a0e4

##AWS Toolkit for Visual Studioのインストール
こちらからダウンロード&インストールを行います。

https://aws.amazon.com/jp/visualstudio/

##既存のASP.NET Coreプロジェクトのフレームワークを.NET 5から.NET Core 3.1へ変更する
調べた感じですと、まだAWS Lambdaでは.NET 5がサポートされていないようだったので.NET Core3.1へフレームワークを変更しました。
![frameworkChange.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/40e19e31-d3db-d8

元記事を表示

slackのモーダルからlambda関数を実行できるようにする

# やりたいこと

slackのモーダルからlambda関数を実行できるようにします
![out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176335/65e45de2-8d0b-72e1-8ca4-09a5387bbc23.gif)

# やったこと

今回のコードでは下記アプローチでモーダルを起動できるようにします。

* グローバルショートカットで起動
* 全てAPIを投げることで実行
* views.openとviews.update(とchat.postmessage)
* views.pushではなく、views.updateを使う
* pushの場合、複数のダイアログを開いたときに、閉じる操作を明示的に行う必要があり手間
* というかダイアログを閉じさせるやり方がよくわからなかった。。。

# コード

“`python
import base64
import json
import os
import urllib.parse
import boto3

元記事を表示

Terraform/TerrafomrerでAWS既存リソースをインポートする

## はじめに
Terraformを使ってみると`Terraformでコードを書く` よりも `既存リソースをTerraformにインポート`することが結構あります。
公式のドキュメントを読めばやり方はわかります。

ただ、少しわかりづらい箇所もあるので細かい部分も説明しながらインポート手順を説明していきます

## 前提
* AWSアカウント作成済
* AWSリソース作成済(今回は[こちらの記事](https://qiita.com/YK0214/items/59bc0e5ae89f68af74b3)で作成したlambda関数をリソースとして使用します。他のリソースでも構いません)
* terraform インストール済 (参考: https://dev.classmethod.jp/articles/beginner-terraform-install-mac/)
* terraformer インストール済 (参考: https://beyondjapan.com/blog/2020/05/terraformer-import-existing-infrastructur

元記事を表示

ServerlessFrameworkを触ってみた

ServerlessFrameworkのインストールから基本的な設定・操作方法を確認していきたいと思います。
今回はAWSをプロバイダとしてPython3でサービスを作成します。

# ■ インストール
### # Serverless Frameworkのインストール
node.jsのインストールはnvmで行います。

“`bash
# nvm インストール
# https://github.com/nvm-sh/nvm#installing-and-updating
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

# 最新のltsをインストールしてグローバルに設定
nvm install –lts
nvm use –lts

# インストールされているか確認
node -v
npm –version

# serverless frameworkのインストール
sudo npm install -g serverless
sls –version
“`

元記事を表示

LambdaでS3のPDFを画像化して保存(Docker,Python)

# はじめに

LambdaでPdfを画像化します。windowsであればpopplerのstatic buildがあるので比較的簡単にできますが、Lambdaの環境ではコンテナを使わないとその方法では実行できません。コンテナの勉強を兼ねて作りました。

# 前提
– Dockerの実行環境
– AWS CLIとaws configureの設定

# やること
– Dockerイメージの準備
– ECRの準備
– Lambdaの作成

**Dockerイメージの準備**

以下のようなファイル構成です。

“`
CreatePdfThumbnail
│ app.py
│ Dockerfile
│ env.txt
└─ requirements.txt
“`

Dockerfileは以下のようになっています。

“`Dockerfile
FROM public.ecr.aws/lambda/python:3.6
# ベースイメージはPython3.6環境を使いたいのでpublic.ecr.aws/lambda/python:3.6

RUN y

元記事を表示

AWS Lambda 関数を Docker コンテナを使ってビルド & デプロイ

# 概要

記事 [第一回 コンテナ Lambda の”いろは”、AWS CLI でのデプロイに挑戦 !](https://aws.amazon.com/jp/builders-flash/202103/new-lambda-container-development/?awsf.filter-name=*all) を参考に

windows10 で AWS Lambda 関数を Docker コンテナを使ってビルド & デプロイ する方法を書きました

AWS Lambda 関数を Docker コンテナを使ってビルド & デプロイ するには以下の3ステップが必要です

1.**Docker イメージ**を作成する
2.**Docker イメージ**を **Amazon ECR リポジトリ** にプッシュする
3.**Lambda関数**に **Amazon ECR リポジトリ**(の Docker イメージ) から ビルドする

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

元記事を表示

EC2の起動直後のCloudWatchアラームを抑止する

起動直後のCloudWatchアラームの通知を抑止したいという要望があったので、AWSサービスを組み合わせて実現してみました。

#構成
EventBridge + Lambdaで実現します。
EC2起動直後の一定時間を待つために、起動時にはStep FunctionsからLambdaを呼び出します。

EventBridgeやStep Functionsは応用の幅が広いので、その一例としても役立ちそうです。

# Lambdaコード
まずはLambdaコードから見ていきます。

“`python
import boto3

target = {
“test-instance” : [‘test-alarm’]
}

def lambda_handler(event, context):

client = boto3.client(‘cloudwatch’)

if event[“Action”] == ‘enable’:
response = client.enable_alarm_actions(

元記事を表示

Lambda Layersで快適に開発する方法

みなさん、Lambda Layers使ってますか?
共通で利用するロジックをライブラリにできる、ということで登場時は大変盛り上がりました。
(それまでは関数ごとにライブラリ部分にシンボリックリンク貼って利用してた)

ただ開発を重ねるにつれて、「これ、色々不便じゃ、、、?」と思うことが湧き上がってきました。

# 根本原因:ローカルで/optを参照するの辛い

Layersのデプロイ先は/optになるので、ローカルでもそれに対応する方策を色々と取る必要があります。

### docker使って/optにLayersをマウントする

可能です。可能ですが、テストやビルド時にわざわざdockerに入るのめんどくさい、、
加えて、IDEにdockerを認識させるのが環境によりますが、面倒くさかったり、有料じゃないとできなかったりします。
IDEが「/optなんてないよ」と認識してくれない状態での開発は無理ゲー

### シンボリックリンクを使う

こちらも可能です。可能ですが、プロジェクトが複数に跨がってくるとその管理がまた面倒になってきます。
ローカルのグローバル領域荒らしたくないんじゃ、

元記事を表示

AWS Lambdaで独自にログを出力したい(標準のログを出したくない)

#問題
Lambda標準のログを抑止してCloudWatchLogsのコストを節約したい。けど、特定の場合にはログを出力したいといった問題を解決します。

#Lambdaコード
早速ですが、このような関数を用意してlambda_handler内で使用します。
必要な権限(IAMポリシー)は後で解説します。標準のログを出さないようにするのも、IAMポリシーの定義で行います。

“`python
import boto3
import time
import datetime

logs_client = boto3.client(‘logs’)
lgn = ‘/aws/lambda/PutLog’

def lambda_handler(event, context):
put_log(‘test’)
put_log(‘テスト’)

def put_log(message):

# ロググループがない場合作成
res = logs_client.describe_log_groups(
logGroupNamePrefix=lgn

元記事を表示

Lambda+Rustのデプロイメントをコンテナイメージと.zipファイルアーカイブの両方で試す

##はじめに
表題の通りです。
SAM CLIからカスタムランタイムを使ってLambdaをデプロイの設定情報を作っていたのですが、ImageとZipどちらがいいのかわからずどちらも試しました。
今後どちらも選択的に使えるようにまとめておきます。

##Zip
####構成

“`bash
lambda_rust
├──.aws-sam
├──samconfig.yaml
├──stock_data
| ├──Cargo.lock
| ├──Cargo.toml
| ├──Makefile
| └──src/main.rs
└──template.yaml
“`
####設定
“`toml:template.toml
AWSTemplateFormatVersion: ‘2010-09-09’
Transform: AWS::Serverless-2016-10-31
Description: >
Sample rust application for Lambda

Resources:
HelloRustFunction:

元記事を表示

【webhook】Slackの高度なワークフローが便利なことに気づいた

Slackワークフローの「高度な設定」として、webhookがあります。
![コメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666457/10c9bc56-b9b8-a308-af2d-283b97f9d7d3.png)

ワークフロー自体はけっこう組織内でもみんな気軽に使ってたのですが、
webhookのボタンは押したことがありませんでした。ワークフロー登場時には記事もなかった気がするし。

https://qiita.com/yuji_saito/items/5dc2b079d4e43bd381d8

ですが、↑こちらの記事を拝見して、「エッ、もしかしてすごい便利…!?」と思ったので、使ってみることにしました。

# 実際に使ってみた
今回は、自組織で使っているClickUpというタスク管理ツールでタスクを作成すると、Slackに通知がされるという仕組みを構築します。
ClickUpのAutomationという機能と、Slackワークフローを組み合わせて作ります。

ClickUpには

元記事を表示

AWS LambdaでサクッとAPIを叩きたい

#AWS マネジメントコンソール上でLambdaを実装して、APIを叩きたい
サクッとWEBAPIをLambdaで叩きたい人向けです。
AWSのコンソール上のコードエディターのみで作業を完結させたいときに。

##こんな人向け
・WEBAPIを実行したい
・AWSマネジメントコンソールのみで作業を完結させたい
・headerに認証キーを付けたい
・認証キーは環境変数に入れておきたい
・返り値はステータスコードだけ取れればよい

##環境情報
AWS Lambda

– ランタイム:Python3.9

##ソースコード(PUT API)
Lambda 標準の同包モジュールのみでの実装するため、
AWS Lambda コードエディター上に下記を張り付けるだけです。

“`python
import os
import json
import urllib.request

def lambda_handler(event, context):

#PUT API
url_str = “https://APIURL/”
headers = {“

元記事を表示

S3操作をするLambda関数(Python-image)をSAM CLIを使ってデプロイする手順をまとめてみる

##はじめに
Lambda関数を作成するにあたり、必要な手順をざっくりまとめました。
以下も試しました。

– 1つのアプリケーションで複数の関数の定義
– S3の操作周りをLambdaで行う
– SAM CLIのローカルテストを試す

##開発者のIAMユーザ作成
開発とデプロイで使用します。
![スクリーンショット 2021-09-04 3.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380300/35a521dc-8ae5-66ad-5764-947364e38860.png)
![スクリーンショット 2021-09-04 3.38.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380300/399a653b-7a69-e8ea-447f-0ce564bf8239.png)
あとは、デフォルトのまま作成し、アクセスキー、シークレットアクセスキーを保存

#####必要な場合アクセス権を追加
ユー

元記事を表示

AWS Lambda + API Gateway でサーバサイドレンダリング

# AWS Lambda でサーバサイドレンダリング 基礎編

パラメータ無しで `GET リクエスト`されたときに、動的に生成されたHTMLを返す仕組みを `AWS Lambda` + `API Gateway` で実装します。

`GET`の`クエリパラメータ`や`パスパラメータ`、`POST` などのパラメータ付きリクエストは、応用編で紹介します。

# Lambda レイヤー準備
AWS Lambda の Node.js ランタイムで npm モジュールを利用するため、レイヤーを作成します。

[ドキュメント-Lambda レイヤーの作成と共有](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html)

**※以下は AWS CloudShell で作業します。**

[ドキュメント-CLI aws lambda publish-layer-version](https://docs.aws.amazon.com/cli/latest/reference/lambda/publ

元記事を表示

OTHERカテゴリの最新記事