- 1. [Node]AWS LambdaからDynamoDBを操作する
- 2. PostmanでJSONをPOSTし、DynamoDBに格納するノウハウメモ
- 3. EC2/Win の Software Inventory を作ったみた。 Describe して DynamoDB に Put。lambda/python 3.8 で。
- 4. EC2 インスタンスの特定の情報を収集する
- 5. ssm inventory を aws lambda / python3.8 でたたいてみた。
- 6. describe 等で取得した情報を Dynamo DB に保存する
- 7. aws lambda で「Task timed out after 3.00 seconds」エラー
- 8. “errorMessage”: “name ‘instnaceid’ is not defined” エラー
- 9. EC2 を台数分リストする
- 10. “errorMessage”: “Syntax error in module ‘lambda_function’: invalid syntax (lambda_function.py, line 14)”エラー
- 11. “errorMessage”: “An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.”, エラー
- 12. AWS Lambdaの中からPythonでAWSアカウントIDを取得
- 13. LambdaからEC2に対してAWS Run Command を実行する手順
- 14. AWS CDK で Lambda + CloudWatch Event の 日次 Slack 通知を作る
- 15. LambdaでJava入門しようとしてハマった
- 16. aws lambda で UnauthorizedOperation エラー
- 17. PrismaのMigrationをAWS Lambdaで実行する
- 18. [serverless]AWS Lambdaでnode-canvasを利用した画像生成をする
- 19. EC2の一覧を必要な情報だけ絞ってS3へ日次保管
- 20. AWS IoT検証メモ③:IoT action
[Node]AWS LambdaからDynamoDBを操作する
こんにちは take-2405です。
今回はnodeでAWS Lambda関数を作成しました。(DymanoDBも触りました)
今後開発する際のテンプレートとして残しておきたいと思います。
(今回はDynamoDBのデータを取得しています)
“`javascript:index.js
const AWS = require(“aws-sdk”);
// DBと接続 (regionを指定するとaws accountに紐づくDynamoDBに接続されます。)
const dynamoDB = new AWS.DynamoDB.DocumentClient({
// region は人によって変わります。日本だとap-northeast-1かな?
region: “ap-northeast-1”
});
exports.handler = async (event) => {
//DynamoDB のクエリを記載する
let getDatas = async (argument) => {
const params = {
PostmanでJSONをPOSTし、DynamoDBに格納するノウハウメモ
# 概要
Postmanを用いてJSONをPOSTし、JSON内の情報をDynamoDBに格納するための環境を構築したためメモを残します。# 1.DynamoDBのテーブル作成
パーティションキーとソートキーは以下のように設定しました。右下の青い作成ボタンを押すとテーブルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516301/d18c0a13-717d-dd56-63b3-024cd26b76bd.png)# 2.Lambda関数の作成
JSONの情報をDynamoDBに格納する仕事をしてくれるLambda関数を作成します。ランタイムはPython 3.7を用いました。
IAMでLambdaがDynamoDBに書き込みできるようにロールを作成し、適用してください。“`python:data-store.py
import boto3
from decimal import Decimaldynamodb = boto3.resource(‘dy
EC2/Win の Software Inventory を作ったみた。 Describe して DynamoDB に Put。lambda/python 3.8 で。
動作イメージ。
1.ec2/describe_instances を実行し、InstanceIDを取得
2.「1」で取得した InstanceID を引数として、ssm/list_inventory_entries を実行し、Software の Entry を取得
3.「1」と「2」の結果を引数として、dynamodb.put_item を実行し、DDBテーブルに入力。
を繰り返す。以下では、各ステップの動作を確認した上で、最後にがっちゃんこする。
###Step1. EC2のリストを取得してみる。
“`python:lambda
import boto3
import jsondef lambda_handler(event, context):
#EC2クライアント定義
ec2_client = boto3.client(‘ec2’)#EC2インスタンスのリストを取得するため、describe。
response = ec2_client.describe_instances()#インスタンス台数分Inventoryを
EC2 インスタンスの特定の情報を収集する
素人が自分のノートとして書いてますが、改善点あれば是非コメントください
###リージョン指定
ec2クライアント定義時に、region_name = ‘us-west-2’ 。“`python:lambda-python38
import json
import boto3def lambda_handler(event, context):
#ec2 client を定義、引数の region_name = ‘xxx’ でリージョン指定。
ec2client = boto3.client(‘ec2’, region_name = ‘us-west-2’)#describe した値を response に入力
response = ec2client.describe_instances()#response を出力
print(response)
“`### Describeで出力される順番を使った特定のインスタンスを指定。
response[‘Reservati
ssm inventory を aws lambda / python3.8 でたたいてみた。
素人が自分のノートとして書いてますが、改善点あれば是非コメントください
###まず AWS CLI でコマンドを確認
InstanceID と インベントリタイプの指定が必要。“`awscli:aws-cli
aws ssm list-inventory-entries –instance-id i-xxxxxxxxxxxx –type-name AWS:Application
“`
今回リストしたかったのは PV Driver。確認出来た。“`awscli出力:awscli出力(一部抽出)
{
“TypeName”: “AWS:Application”,
“InstanceId”: “i-xxxxxxxxxxxxxxx”,
“SchemaVersion”: “1.1”,
“CaptureTime”: “2021-05-17T10:44:06Z”,
“Entries”: [
{
“Architecture”: “x86_64”,
“Ins
describe 等で取得した情報を Dynamo DB に保存する
素人が自分のノートとして書いてますが、改善点あれば是非コメントください
DynamoDBテーブルに入力する値を渡された関数だけをピックアップ。
“`python:aws-lambda-python3_8
import json
import boto3def lambda_handler():
#DynamoDBテーブルはあらかじめ作ってある前提。本来なら、テーブルが無ければ作るみたいな感じにすべき。
table_name = ‘test’#DynamoDBテーブルに行として追加する情報を item として定義
item = {
“db-instance-id”: ‘i-xxxxxxxxxxxx’,
“db-instance-version”: ‘1.23.3’
}#DynamoDBクライアントを定義
dynamodb_client = boto3.resource(‘dynamodb’)#テーブルにItemを入力
d
aws lambda で「Task timed out after 3.00 seconds」エラー
【Task timed out】
timeout だよ。lambda 関数の実行時間はデフォルト3秒に制限されているので、処理終了が3秒以上かかるときは変更が必要です!“`json:エラー
{
“errorMessage”: “2021-05-18T04:20:10.454Z 95510f9b-1d66-48f6-bad0-xxxxxxxxx Task timed out after 3.00 seconds”
}
“`設定 → 一般設定 → タイムアウト で、デフォルト3秒を変更。
“errorMessage”: “name ‘instnaceid’ is not defined” エラー
素人が自分のノートとして書いてますが、改善点あれば是非コメントください
32行目 の【instnaceid】という文字が定義されていないよ。というエラー。
まぁ、だいたい入力間違い。w
よく文字を見直してね。
67行目 がクローズアップされているのは67行目から呼び出された関数内での事象だから。“`json:エラー
{
“errorMessage”: “name ‘instnaceid’ is not defined”,
“errorType”: “NameError”,
“stackTrace”: [
” File \”/var/task/lambda_function.py\”, line 67, in lambda_handler\n get_inventory(instanceid)\n”,
” File \”/var/task/lambda_function.py\”, line 32, in get_inventory\n print(instanceid_name, instnaceid, n
EC2 を台数分リストする
素人が自分のノートとして書いてますが、改善点あれば是非コメントください
EC2 を台数分リストします。
“`python:aws-lambda-python38
import boto3
import jsondef lambda_handler(event, context):
#EC2クライアント定義
ec2_client = boto3.client(‘ec2’)#EC2インスタンスのリストを取得するため、describe。
response = ec2_client.describe_instances()#インスタンス台数分 for 文で回す
for reservation in response[“Reservations”]:
for instance in reservation[‘Instances’]:
instanceid = instance[‘InstanceId’]
#表示
pr
“errorMessage”: “Syntax error in module ‘lambda_function’: invalid syntax (lambda_function.py, line 14)”エラー
【Syntax error in module ‘lambda_function’:】
構文ミスです。例の場合は、関数定義の行末に「:」が抜けてたもの。
ほぼ間違いなく、指摘のある行数(今回は14行目)のどこかに、正しくない構文(何かが足りないとか、コロンとセミコロンがまちがってるとか)があるので、おちついてじっくり1文字ずつ見直そう!“`json:エラー
{
“errorMessage”: “Syntax error in module ‘lambda_function’: invalid syntax (lambda_function.py, line 14)”,
“errorType”: “Runtime.UserCodeSyntaxError”,
“stackTrace”: [
” File \”/var/task/lambda_function.py\” Line 14\n def get_inventory(instanceid)\n”
]
}
“errorMessage”: “An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.”, エラー
【An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation】
DescribeInstances するための権限がない。というエラー。“`json:エラー
{
“errorMessage”: “An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.”,
“errorType”: “ClientError”,
“stackTrace”: [
” File \”/var/task/lambda_function.py\”, line 10, in lambda_handler\n response = ec2_client.describe_instances()\n”,
” File \”/var/runtime/
AWS Lambdaの中からPythonでAWSアカウントIDを取得
Pythonで書かれたAWS Lambdaの中からAWSのアカウントIDを取得するには、
“`python
account_id = boto3.client(“sts”).get_caller_identity()[“Account”]
“`これで12桁の文字列を取得できす。
なお、リージョンやLambdaの名前などは環境変数から取得できます。
[AWS Lambda 環境変数の使用 – AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html)
例: `os.environ[“AWS_REGION”]`
# 試したサンプルコード
ここではServerless Frameworkを使っています。
Serverless Frameworkのプロジェクト作成
“`console
$ serverless create –template aws-python3
“``serverless.yml` 作成
“`yaml
serv
LambdaからEC2に対してAWS Run Command を実行する手順
## 参考
[How to execute command remotely on EC2 via Lambda function using SSM](https://www.youtube.com/watch?v=l2NeAs2gNOo)
[コマンドのステータスについて](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/monitor-commands.html)## 次の順番で進める
– ec2のためのiam roleを作成
– 既存のEC2にロールを割り当てる
– コンソールで`ssm sendCommand`できるか試してみる
– lambdaのためのiam roleを作成
– 既存のlambda functionにロールをわりあてる
– テストする## ec2のためのiam roleを作成
1. awsマネジメントコンソールでIAMへ進む
2. ナビゲーションでロールへ進む
3. ロールの作成へ進む
4. 一般的なユースケースでEC2を選択
5. EC2がフォーカスされた状態で
AWS CDK で Lambda + CloudWatch Event の 日次 Slack 通知を作る
# はじめに
Lambda Function + CloudWatch Event な日次Slack通知を AWS CDK を使って作りました。
Python で作ってます。
CDKを触るにはちょうどいい規模でした。# 作るもの
毎日9時にAWSの利用料金をSlack通知してくれるやつ。
![スクリーンショット 2021-05-18 14.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112011/36b5a29d-f978-04f5-e274-788031e56ba7.png)# 環境
“`zsh
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.7
BuildVersion: 19H2
“`# 開始
## AWS CKD のインストール“`zsh:terminal
npm install -g aws-cdk
“`
バージョン確認“`zsh:terminal
cdk –version
LambdaでJava入門しようとしてハマった
# 経緯
普段はNode.jsで開発していますが、LambdaでJavaを使うテストをしている方がエラーで行き詰っていたので一緒に調査しました。# 結論
Lambdaのハンドラー設定が間違っていました。
デフォルトでは、`example.Hello::handleRequest`
だったのを、
`com.example.Hello::handleRequest`
に変更したところ実行できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162215/f1710c19-7996-6947-61f9-eb0eed391293.png)
[こちら](https://qiita.com/niwasawa/items/69bba64d7cd2d6277473)の記事を参考にしました。# 何しようとしてたの?
LambdaでJavaを使用するのが初めてだったので、まずは[こちら](https://blog.mmmcorp.co.jp/blog/2020/03/29/lambda-ha
aws lambda で UnauthorizedOperation エラー
aws の lambda で EC2 のリストを生成したく、describe_instances(python3.8/boto3)を実行したら以下のエラー。
“`
Response
{
“errorMessage”: “An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.”,
“errorType”: “ClientError”,
“stackTrace”: [
” File \”/var/task/lambda_function.py\”, line 8, in lambda_handler\n response = ec2client.describe_instances()\n”,
” File \”/var/runtime/botocore/client.py\”, line 357, in _api_call\n
PrismaのMigrationをAWS Lambdaで実行する
# はじめに
TypeScript用のORMである[Prisma](https://www.prisma.io/)は、DBのスキーマをMigrationという方法で管理することができる。
ActiveRecordのMigrationとよく似ており、`CREATE/ALTER TABLE`のSQLクエリを順次適用していく感じのもの。Migrationは、DBと疎通している環境から `prisma migrate` というコマンドを打つことで適用できる。
本記事では、このPrismaのMigrationをAWS Lambdaでサーバーレスに実行する方法を紹介する。# 方法
大まかなアーキテクチャは下図。
なお本記事はDBがAWS上にあることを前提としているが、他のクラウドでも同様の方法は取れるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127392/70ef0478-3cda-92f2-6caa-edab85306975.png)実際のコードは、[こちらのリポジトリ]
[serverless]AWS Lambdaでnode-canvasを利用した画像生成をする
# 前書き
OGPの生成などnode.jsで画像生成をしたいというケースは最近増えてきているのでは無いでしょうか。その中でもクライアントで実行可能な[Canvas](https://developer.mozilla.org/ja/docs/Web/API/Canvas_API)を利用したいケースというのも同様に多いと思います。またサーバーレスの台頭と共にデプロイに[serverless](https://www.serverless.com/)を利用しているケースもあると思います。
私自身がその様な環境で試す中、実行するまでに躓いた箇所があったので実際に動く簡単なアプリを作りながら途中の問題の解決法を解説していこうと思います。
# 実行環境
デプロイ: [serverless](https://www.serverless.com/)(テンプレート: [aws-nodejs-typescript](https://github.com/serverless/serverless/tree/master/lib/plugins/create/templates/aws-node
EC2の一覧を必要な情報だけ絞ってS3へ日次保管
### 実装の方法
LambdaのPython(boto3)を使います。
1日1回実行するトリガーとして、EventBridgeを使います。### 実装できると何がうれしいのか
**1点目**
EC2のdescribe_instances APIは、取得結果が冗長なデータ構造となっていて、Javascriptなどで取り込んだ時にやや扱いにくいです。
特に、`Reservations[*].Instances[*]` の階層の深さと、タグの構造が `[{‘Key’: ‘タグキー名’ }, {‘Value’: ‘タグの値}]` となっている点が冗長でしょうか。
階層を単純な1次元配列(Pythonのリスト)とし、欲しい情報だけに絞ることで、プログラムから扱いやすくなります。**2点目**
AWSのAPI/CLIでは、**”現時点の”**EC2の一覧を取得できますが、**”x月x日時点の”**EC2の一覧を取得したいとなった場合に、急に困ることになります。
1日1回Lambdaを実行して蓄積しておくことで、簡単に調べられるようになります。### IAMロールの作成
IAM
AWS IoT検証メモ③:IoT action
公式ドキュメント
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-rule-actions.html##IoT action とは
IoT rure で受け取ったTopicのデータを他のサービスへのアクションにつなげるのがIoT action。
IoT rule内でこのIoT actionを設定することでAWS IoT Coreと他サービス間でデータ連携を行うことができるようになります。
ここでは比較的簡単にサービス間の連携を行うことができる方法として、– AWS IoT Core->AWSの他サービスへのデータ連携
– AWS IoT Core->RESTを使った他サービスへのデータ連携の2点について説明していきます。
IoT rule自体の説明は以下の記事を参考にしてください
https://qiita.com/tomzono/private/12f6253c864f8f8c4070## AWS IoT Core->AWSの他サービスへのデータ連携
IoTRureを使ってAWS