- 1. REST APIでDynamoDBのテーブルを操作
- 2. 想定外のメール大量送信によるSNSサブスクリプションの非アクティブ化に対処する
- 3. CloudWatchログアラームの作成が面倒なので、Excelから設定値を読み込んで作成できるようにしてみた。
- 4. AWS Lambdaに固定IPを付与する時の考慮事項(NAT Gatewayは0.062ドル/時、月約45ドル)
- 5. エンジニアインターン10日目
- 6. AWS Lambda + Python で並列処理
- 7. Lambdaコンテナをローカルでデバッグする方法
- 8. ServerlssFramework でLambdaコンテナをデプロイ
- 9. AWS Lambda(node.js)でyoutube APIを利用してJSON作成した話
- 10. 【備忘】Api Gatewayのステージ変数とLambdaのエイリアスが繋がることを理解する
- 11. Lambda関数からAmazon SQSにデータを送信する時ハマったこと
- 12. AWS lambdaでEmacs key bindingを使う
- 13. 【EC2】Lambdaから時刻指定でEC2を自動起動・停止を時刻実現する
- 14. 【別アカウントのLambda】を実行可能なLambdaをNode18 + AWS SDK for JavaScript v3で構築してみる
- 15. VPCアクセス可能なlambda関数をamplifyで作成する方法 発展版 ~ env毎にVPCを切替可能とする
- 16. VPCアクセス可能なlambda関数をamplifyで作成する方法
- 17. Amazon Timestreamからboto3でデータを取得する
- 18. AWS EventBridge S3にファイルが格納されたことを起点にlambda関数を実行する(EventBridge)
- 19. AWS SDK V3 のSQS(Simple Queue Service)で、いくつか動作確認した話(AWS SDK V2 → V3 移行Tips)
- 20. Pythonコードの中に記載されたHTMLテキストをブラウザで表示する(Api Gateway,Lambda)
REST APIでDynamoDBのテーブルを操作
## 概要
REST APIでAWS上のDynamoDBのテーブル操作を行う方法を記載
CURLでAPI GatewayにデプロイしたAPIを叩いてDynamoDBと通信## 目次
1. REST APIとは
1. DynamoDBのテーブルを作成
1. ロールの作成
1. Lambda関数を作成
1. API GatewayでAPIをデプロイ
1. CURLによる動作確認## 1. REST APIとは
REST APIは、REST(Representational State Transfer)の原則に基づいて設計されたAPIのことを指し、HTTP通信によって、データの作成/読み取り/更新/削除の機能を実行できます。要求されたリソースに関する情報を提供し、以下の4つのメソッドを使用してリソースの処理方法を記述します。
GET:リソースを取得
POST:リソースを作成
PUT:リソースを更新
DELETE:リソースを削除
また、リソースを様々な形式(HTML/XML/JSON/バイナリ)で表現できるようになっています。## 2. DynamoDBのテーブルを作成
一連の手
想定外のメール大量送信によるSNSサブスクリプションの非アクティブ化に対処する
# はじめに
Amazon SNSには、Eメッセージの配信レート(1秒あたり10件)の上限を超過した場合に、SNSサブスクリプションを非アクティブ化させる仕様があります。
参考URL: [Amazon SNS サブスクリプションを手動で無効にしたことを示す E メールが AWS から届いたのはなぜですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-email-subscription-disabled/ “AWS公式ドキュメント”)つい先日この問題を対処したことがあったため、投稿しました。
# 発生ケース
![SNS_AWS構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046178/e622da65-f3d9-5901-52d6-b39189ccdc72.png “SNS_AWS構成図.png”)1. CloudWatch Logsのロググループにサブスクリプションフィルターを設定
1. サブスクリ
CloudWatchログアラームの作成が面倒なので、Excelから設定値を読み込んで作成できるようにしてみた。
# はじめに
こんにちは、山田です。
今回は、CloudWatchログアラームをExcelから作成する方法について記載していきます。
よろしくお願いします。
# 概要図
概要図は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/54c80c37-30f4-620f-a821-a86a723978cb.png)
①:Lambdaを用いて、Excelファイルを作成してS3にアップロードします。
②:作成されたExcelファイルをダウンロードします。
③:ダウンロード後、Excelファイルを記入してアップロードします。
④:Lambdaを用いて、Excelファイルを読み込みCloudWatchアラームを作成します。
# エクセルファイル作成用Lmabdaのフローチャート・コード
エクセルファイル作成用Lmabdaのフローチャート・コードはそれぞれ以下になります。
## フローチャート
フローチャートは以下の通りです。
![フローチャート (1).png](http
AWS Lambdaに固定IPを付与する時の考慮事項(NAT Gatewayは0.062ドル/時、月約45ドル)
AWSの請求書を見たら想定外に高かったので調べたらNAT Gatewayでした。
t4g.xlarge(vCPU:4、メモリ:16GB)を借りられる(3年予約)料金じゃないか・・・。[![Image from Gyazo](https://i.gyazo.com/79c797e8431503a4fbc82fd6a53ca65d.png)](https://gyazo.com/79c797e8431503a4fbc82fd6a53ca65d)
これは、ある外部システムとの連携機能をAWS Lambdaで実装したのですが、IP制限に対応するために固定IPを持たせる必要があったため。
不覚にも発生する料金はElastic IPだけだと思いこんでました。涙
反省。
エンジニアインターン10日目
今日はpythonを使ってスクレイピングをした。Beautifulsoupを使ってDOM要素を取り、得た情報を配列に渡して、DBに保存する仕組みだった。複数のページからスクレイピングをしたかったため、urlを配列に渡して、ページごとに正しい値を取るようにした。lambda上でtestをしてエラーを解決しながら進めた。やはり、初心者だと、エラーを解決するのに時間がかかってしまったり、工夫がまだまだ足りていない。そこで、先輩エンジニアに質問することでエラーに対する工夫の仕方や考え方などを教えていただくことができる。自分で検索して探すことももちろん大切であるが、いつでも質問できて、改善させてくれるような環境を持つこともとても大切であると考えた。そろそろインターンを初めて1か月を立とうとしている自分にもタスクに対する責任感も出てきて、日々成長した姿を証明していきたいと思う。しかし、まだまだ分からないことの方が多い。失敗を恐れず、チャレンジを辞めずに成長していきたい。
AWS Lambda + Python で並列処理
AWS Lambda で Python の multiprocessing を扱おうとしたら少しハマったのでメモしておく。
:::note warn
この記事内のコードはすべて AWS Lambda の Python 3.9 ランタイムで実行する想定で書かれています。
:::## 例題
例えば、以下のような Lambda 関数があるとする。“` python:main.py
from time import sleepdef square(n: int) -> int:
“””1秒かけて入力値の2乗を返す関数”””
sleep(1)
return n ** 2def handler(event, context):
return [square(i) for i in range(5)]
“`この関数の実行には5秒かかってしまうため、 `square` 関数を並列処理して実行時間を短縮したい。
## asyncio 版
まずはシンプルにイベントループで非同期処理できないか考える。Python の非同期処理と言えば `a
Lambdaコンテナをローカルでデバッグする方法
## 概要
Lambdaをコンテナ毎デプロイすることができるようになりましたが、
今回は、ローカル環境でデバッグする方法について書き記します。
わざわざデプロイしてクラウド環境上でテストする手間が省けます。## 方法
ファイル構成は以下となります(ServerlessFrameworkを利用しています)
“`
aws-python-docker-demo
├── Dockerfile
├── README.md
├── app.py
├── requirements.txt
└── serverless.yml
“`今回デバッグ用に用意したコードはこちらです。
シンプルにリクエストの結果を返却するコードを書いています。“`app.py
import json
import requestsdef handler(event, context):
res = requests.get(“http://example.com”)
response = {
“statusCode”: 200,
“body”: re
ServerlssFramework でLambdaコンテナをデプロイ
## 概要
Lambdaの関数コードをコンテナイメージでデプロイすることができますが、
今回はServerlessFrameworkを使って簡単にクラウド環境にデプロイする手順を書き記します。## 手順
1.サンプルコードを作成
“`
$ serverless create –template aws-python-docker –path aws-python-docker-demo
✔ Project successfully created in “aws-python-docker-demo” from “aws-python-docker” template (3s)
“`2.デプロイコマンド実行
“`
$ serverless deployDeploying aws-python-docker-demo to stage dev (ap-northeast-1)
✔ Service deployed to stack aws-python-docker-demo-dev (187s)
functions:
hello: aws-py
AWS Lambda(node.js)でyoutube APIを利用してJSON作成した話
## どんな記事
・AWSを使ってyoutube APIにアクセスするLambda関数を作成したときのお話
node.jsの作成例が少なかったのでこんな感じでうまくいったよが伝われば・・## 利用技術
・AWS Lambda
・AWS S3
・youtube-node(youtube API) ※google developerに登録する
・node.js 16## 前提条件
・node.js 16での開発パッケージのインストール
“`
npm install youtube-node
npm install aws-sdk
“`## 作成したコード(抜粋)
“`
const AWS = require(‘aws-sdk’);
const s3 = new AWS.S3({‘region’:’<地域>’});const Youtube = require(‘youtube-node’);
const youtube = new Youtube();exports.handler = function(event, context, callbac
【備忘】Api Gatewayのステージ変数とLambdaのエイリアスが繋がることを理解する
# まえがき
Api GatewayとLambdaで構成されているサーバーレス環境の話。
Api Gatewayの複数のエンドポイントと同じLambda関数を紐付けることができます。
たとえばdev環境とprod環境があってLambda関数がひとつである場合、dev環境への変更がprod環境へも反映されることになります。
dev環境で行った変更をテストした上でprod環境へ反映させたい場合、Api Gatewayのステージ変数とLambdaのエイリアスが役に立ちます。
ネット上にやり方は書いてありましたが、図解が見つけられなかったため、ここに備忘として残したいと思います。
細かい設定値や設定方法はネット上に多く存在したため省きます。# 図解
いきなり結論ですが、Api Gatewayのステージ変数とLambda関数のエイリアスのつながりは以下のようになります。
Lambda側ではエイリアス名を設定し、Api Gateway側ではステージ変数を設定することで、連携できるようになります。
![image.png](https://qiita-image-store.s3.ap-nort
Lambda関数からAmazon SQSにデータを送信する時ハマったこと
# はじめに
Lambda関数からAmazon SQSにデータを送信する時、ハマったことがあったので備忘録として残しておく。# 前提条件
– Lambda関数からAmazon SQSにデータを送信する
– Lambda関数はVPC内のプライベートサブネットに設置している
– Lambda関数のIAMロールはAmazon SQSに対してフルアクセス権限を付与している
– Lambda関数はNode.jsで作成# 起こったこと
上記前提条件のもとLambda関数を実行するとタイムアウトしてしまった。
そのときのソースと実行結果はこちら
AWS公式サンプルソースのほぼコピペ
https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/sqs-examples-send-receive-messages.html“`js
var AWS = require(‘aws-sdk’);
AWS.config.update({region: ‘ap-northeast-1’});var sqs = n
AWS lambdaでEmacs key bindingを使う
# きっかけ
MacBookでAWS Lambdaでコーディング中「下の行に移動しよう。`ctrl` + `N`を連打っと。」
(新しいファイルが大量に作成された)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/3a93d02b-0e68-2d3b-2c0c-4de1b1ebfd55.png)「おいいぃぃぃぃい!!!!」
# やったこと
LambdaのPreferenceを起動
– 歯車アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/2be1ced5-f8bf-e699-966c-3512e5ffdbd9.png)画像のように「Emacs」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/2e06a2
【EC2】Lambdaから時刻指定でEC2を自動起動・停止を時刻実現する
# EC2の自動起動・停止を実現したい!
https://qiita.com/YujiHamada3/items/3caccdaded527548432b
上記記事の改良版です。上記記事では自動起動・停止をhour単位でしか指定できず、一日に一度しか指定できませんでした。
それに加えて今回は
– 時刻まで指定できる(10分ごと)
– 複数時刻を指定できる
– 平日指定できるの機能を追加しました。
今回はLambdaを何度も呼び出したくないので10分ごとにしましたが、Lambdaを毎分呼び出せば、分指定までできるようになります。# EC2のタグの設定
![スクリーンショット 2023-01-30 16.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/8f66b619-198e-9555-a157-2849073dde15.png)タグはこの様に設定します。
これだと
平日16時30分に起動して16時40分に停止する。
平日16時50分に起動して17時00分に停止する
【別アカウントのLambda】を実行可能なLambdaをNode18 + AWS SDK for JavaScript v3で構築してみる
## 先に結論だけ知りたい人のために (クロスアカウントでLambdaからLambdaをコールする方法)
この記事の要点を列挙するよ。
– 実行環境がNode18のLambdaにはAWS SDK for JavaScript v3が最初からインストールされていて便利だよ
– Invoke APIで別アカウントのLambdaをコールするよ
– コールされる対象の【別アカウントのLambda】には、リソースベースのポリシーが必要だよ
– コールする側のLambdaには、アイデンティティベースのポリシーが必要だよ“`json:コールされる対象の【別アカウントのLambda】に付与するリソースベースのポリシー
{
“Version”: “2012-10-17”,
“Id”: “default”,
“Statement”: [
{
“Sid”: “[任意の名前]”,
“Effect”: “Allow”,
“Principal”: {
“AWS”: “arn:aws:iam::[呼び出す側のAWSアカウントI
VPCアクセス可能なlambda関数をamplifyで作成する方法 発展版 ~ env毎にVPCを切替可能とする
先に以下の記事を投稿しました
https://qiita.com/kujiraza/items/458629d5a3d210ad45ad
この記事ではamplifyで1つのenvしか用いない前提で記載しています。
本記事ではこの記事(以降元記事と記載します)を発展させて、envを複数用意した場合にenv毎に別のVPCに接続するための手順を記載します。# やること
[元記事の手順](https://qiita.com/kujiraza/items/458629d5a3d210ad45ad#%E6%89%8B%E9%A0%86)をベースとして、以下の部分を変更してlambdaを作成します。
– セキュリティグループIDとサブネットグループIDをパラメータ化し、値は別ファイルに設定する
– 値の設定先としてenv毎にパラメータを指定できる`amplify/team-provider-info.json`を使用する# 前提
`amplify add env`により、devに加えてstgを作成済みとします。 これ以外は[元記事の前提](https://qiita.com/ku
VPCアクセス可能なlambda関数をamplifyで作成する方法
欲しい情報にたどり着くまでに苦労したので残しておきます。
# やること
amplifyで作成したバックエンド用lambda関数に対して、コンソール画面からVPCの設定を変更すると、`amplify push` や `amplify publish`コマンドを実行するタイミングでVPCの設定が消えてしまいます。
そこで本記事では、lambdaのコンソール画面をいじらずにamplifyのみでVPC設定を行い、上記のような場合でも設定が消えないようにするための手順を記載します。# 前提
– amplifyのバージョン: 10.6.2
– amplifyプロジェクト名: vpctestapp ※作成済み
– 接続先VPCにプライベートサブネット3つとセキュリティグループを1つ作成済み
(パブリックサブネットへの接続は試していません)
– amplifyを実行できるよう設定したcloud9を利用以上の環境でlambda関数`vpclambda`を新規追加する場合を想定して、手順を記載します。
# 手順
1. 【事前準備】lambdaの新規作成
1. lambdaのテンプレ
Amazon Timestreamからboto3でデータを取得する
# はじめに
[センサからのデータをAmazon Timestreamに格納した](https://qiita.com/ckw-1227/items/82f3bc0d6c2e689411a5)ので、今度はデータを取り出したい。
データの取得方法をLambdaでpython3.9/boto3を使って確認する。# Timestreamテーブル内のデータ
Timestreamは各項目(メジャー)ごとに1レコードを使う形で格納される。
今回の例ではセンサの位置情報(lat/lon)、温度(temp)、湿度(humi)が格納されている。時間間隔は基本的に3分毎。
| simId(ディメンション) | timestamp(ディメンション) | measure_name | time | measure_value::double |
|:-:|:-:|:-:|:-:|:-:|
| sim_id | 1674918682708 | lat | 2023-01-28 15:11:24.416000000 | 35.1 |
| sim_id | 1674918682708 | lon
AWS EventBridge S3にファイルが格納されたことを起点にlambda関数を実行する(EventBridge)
# 概要
– S3にファイルがアップロードされたことを起点にlambda関数を実行するためにEventBrigdeで必要な設定をまとめる。
# 情報
– EventBridgeに関しての簡単な情報は下記にまとめてある。
https://qiita.com/miriwo/items/ea12cdba9a1856cf6bd8
# 設定
## S3の設定
1. 新規でバケットを作成し、「look」フォルダを作成する。
1. 当該バケットの「プロパティ」のタブに移動する。
1. 「Amazon EventBridge」の設定部分まで移動し「編集」をクリックする。
1. ラジオボタンでONを選択して「変更の保存」をクリックする。![test-s3-upload-event-bus_-_S3_bucket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d1465f7d-e57d-0e68-84c4-adc3ce204675.png)
![test-s3-upload-event-bu
AWS SDK V3 のSQS(Simple Queue Service)で、いくつか動作確認した話(AWS SDK V2 → V3 移行Tips)
# はじめに
https://qiita.com/Syoji_Yonemoto/items/09883e57643583ef39af
引き続いて、今度は、SQS(Simple Queue Service)についても確認しました。
やはり初回(Firehose)の運が悪かっただけで、基本は互換できてそうだという感触になりつつありますが、自分のメモも兼ねてるので確認できた範囲をまとめていきます。# 結論
SQS(Simple Queue Service)に関しては、私が普段使うメソッド群については、問題ありませんでした。# V2 と同じ使い方で問題なく動作確認できたメソッド
+ sendMessage
+ receiveMessage
+ deleteMessage
+ getQueueAttributes# 余談(雑多な感想)
受信・送信・削除・状態確認、一通りLambdaからSQSを活用する際に利用するAPIは試しましたが、V2の時と変わらぬ使い方ができて良かったです。https://qiita.com/Syoji_Yonemoto/items/e619d
Pythonコードの中に記載されたHTMLテキストをブラウザで表示する(Api Gateway,Lambda)
# 書くきっかけ
Pythonコードの中に直書きしたHTMLを、クライアントからリクエストがあったときにブラウザで表示するコードを書いてみました。
自分の話で恐縮ですが、ちょっとApi GatewayとLambdaのテストをしてみたいと思ったときに、HTMLレスポンスが返せる簡単なLambda関数を用意したくなります。
そういった際に使えるのではと考えました。
# 使うもの
AWSで以下のものを使います。
* Api Gateway
* Lambda (Python 3.9)# やってみる
## Lambda
以下の設定値でLambda関数を作成しました。ほかはデフォルトの設定値です。
| 項目 |設定値|
|:———–|:———–|
|関数名|htmlResponseFunc|
|ランタイム|Python 3.9|
|ハンドラ|lambda_function.lambda_handler|
|アーキテクチャ|x86_64|## コード
`string`型でHTMLを記述し、それを`bytes`型に変換するところがポイントだと思います。
“`pyt