- 1. NodejsでDynamoDB使ってみた
- 2. aws-vaultを用いてAWS SAMローカル実行をIDE上で行う方法。
- 3. CloudFront FunctionsでBasic認証ができるか試してみた
- 4. AWS Lambda
- 5. [Node]AWS LambdaからDynamoDBを操作する
- 6. PostmanでJSONをPOSTし、DynamoDBに格納するノウハウメモ
- 7. EC2/Win の Software Inventory を作ってみた。 Describe して DynamoDB に Put。lambda/python 3.8 で。
- 8. EC2 インスタンスの特定の情報を収集する
- 9. ssm inventory を aws lambda / python3.8 でたたいてみた。
- 10. describe 等で取得した情報を Dynamo DB に保存する
- 11. aws lambda で「Task timed out after 3.00 seconds」エラー
- 12. “errorMessage”: “name ‘instnaceid’ is not defined” エラー
- 13. EC2 を台数分リストする
- 14. “errorMessage”: “Syntax error in module ‘lambda_function’: invalid syntax (lambda_function.py, line 14)”エラー
- 15. “errorMessage”: “An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.”, エラー
- 16. AWS Lambdaの中からPythonでAWSアカウントIDを取得
- 17. LambdaからEC2に対してAWS Run Command を実行する手順
- 18. AWS CDK で Lambda + CloudWatch Event の 日次 Slack 通知を作る
- 19. LambdaでJava入門しようとしてハマった
- 20. aws lambda で UnauthorizedOperation エラー
NodejsでDynamoDB使ってみた
## 背景
はじめて業務でDynamoDBを使用したため、基本的なものだがメモを残して、自身のナレッジとして蓄えようかと## 環境
– node.js
– DynamoDB
– Lambda## 経験した関数
### 登録
– put#### パラメータ
– TableName: テーブル名
– Item: 登録対象“`
ex))
TableName: ‘test-table’,
Item: {
‘id’: 1,
‘name’: ‘test’,
}
“`
### 取得
– get#### パラメータ
– TableName: テーブル名
– Key: AttributeValueのカラム名(一般的なTableのprimary key)“`
ex))
TableName: ‘test-table’,
Key: {
‘id’: 1
‘sort’: 1
}
“`
### 検索
– scan#### パラメータ
– TableName: テーブル名
– FilterExpression: SQLの条件式
– Express
aws-vaultを用いてAWS SAMローカル実行をIDE上で行う方法。
## 事前設定
IDEはPyCharmを使用します。
AWS Toolkit for PyCharmのPluginインストール## アクセスキーによる認証ではなく、aws-vaultにて認証処理
– ~/.aws/config にて[default]にcredential_process追加します。
※credential_processとは外部プロセスの標準出力から認証情報を取得する仕組みとのことです。セキュリティ面の考慮が必要であることに留意してください。– 通常使用しているprofileはそのままで大丈夫です。なければ追記をお願いします。
“`
[default]
region = ap-northeast-1
credential_process = aws-vault exec –json default[profile pycharm-test]
source_profile = default
role_arn = arn:aws:iam::xxxxxxxxxxxxxxxxxxxxxx
region = ap-northeast-1
“`
CloudFront FunctionsでBasic認証ができるか試してみた
# はじめに
結論を申し上げるとできませんでした。悲しみが深いです。
「用法用量を守って正しくお使いください」という言葉がぴったりです。
Basic認証をCloudFrontで実装したいならLambda@Edgeを使いましょう。参考資料:
– [https://michimani.net/post/aws-about-runtime-of-cloudfront-functions/](https://michimani.net/post/aws-about-runtime-of-cloudfront-functions/)
– [https://dev.classmethod.jp/articles/cloudfront-functions-usecases/](https://dev.classmethod.jp/articles/cloudfront-functions-usecases/)
– [https://aws.amazon.com/jp/blogs/news/introducing-cloudfront-functions-run-your-code-at-th
AWS Lambda
#Lambda サーバレス
EC2インスタンスの代わりにコードを実行することで、効率的なアーキテクチャを実現する。
利用者は、ソースコードだけを準備すればすぐに実行できるようになり、自動的にスケール等をおこなてくれる。##Lambdaの特徴
・実行基盤は全てAWSが管理
・AWSサービスと連携させることで簡単にイベントドリブンなアプリケーションを実行可能
・Node.js/javaで書かれたコードを実行可能
・100ミリ秒単位でコード実行時間に対しての課金でありコスト効率が非常に高い
・オートスケール##Lambdaがサポートしている言語
・Node.js
・Ruby
・PowerShell
・Python
・C#
・Java
・Go##Lambda関数
Lambdaを利用するには、Lambda関数という単位で、実行プログラムとその実行トリガーとなるイベントを事前に定義します。実行数に応じて支払いが発生するため、 Lambda関数が無期限に実行されないようにタイムアウト設定がなされています。 指定されたタイムアウトに達するとLambda関数は実行を終了します。そのた
[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