【AWS】LambdaをS3トリガーで起動する方法
API Lambdaのチュートリアルの中に「AmazonS3トリガーを使用してLambda関数を呼び出す」があったのでやってみました。
[1] S3バケットを作成
まずは、S3バケットを作成します。
バケット作成時、特に注意することはありません。
バケット作成後、ファイルをアップロードしておきます。本記事では「test.png」としています。
[2] Lambda関数を作成
「設計図の使用」を選択し、設計図の中から「s3-get-object-python」を選択します。
実行ロールは「AWSポリシーテンプレートから新しいロールを作成」を選択します。ポリシーテンプレートの中から「Amazon S3オブジェクトの読み取り専用アクセス権限」を選びます。
S3トリガーに先ほど作成したバケットの名称を入力します。他はデフォルトのままにしておきます。
[3] テスト
Lambda関数の作成後、テストイベントを作成します。テンプレートから「s3-put」を選びます。
テンプレート内の「example-bucket」を作成したS3バケットのARNに変更します。また、「test/key」をアップロードしたファイル名(本記事でっはtest.png)に変更します。
テストイベント作成後、テストを実行します。上手くいくと次のような実行結果になります。
[4] S3バケットにアップロード
次に、S3バケットに新たなファイルをアップロードしてみます。test2.png, test3.jpg, test4.jpgをアップロードしました。
CloudWatchでLambda関数のログを見ると「image/png」「image/jpeg」が登録されたことが登録されています。
[5] リソースの削除
次のリソースを削除します。
- Lambda関数
- Lambda関数のロググループ
- IAMポリシー
- IAMロール
- S3バケット
終わりに
チュートリアル通りに試して、無事にS3をトリガーとしてLambda関数が起動されました。今回はアップロードされたファイルの種類を返すだけという簡単なものでした。次回は少し実践的な内容にトライしてみたいと思います。
出典
- アイキャッチはGerd AltmannによるPixabayからの画像
【AWS】30分で簡単なウェブアプリケーション構築(Amplify+Lambda+DynamoDB)
AWS公式のハンズオン「AWS で基本的なウェブアプリケーションを構築する」を見て、簡単なウェブアプリケーションを構築しました。
構築方法はハンズオンを見れば、ほとんど分かります。ところどころハンズオン通りに行かないところがあったので、実際にやったときの様子を補足を交えつつ紹介します。
- [1] Amplifyでウェブアプリ作成
- [2] Lambdaで関数作成
- [3] API GatewayでREST APIを作成
- [4] DynamoDB テーブルを作成
- [5] ウェブアプリからデータ登録
- 終わりに
- 出典
[1] Amplifyでウェブアプリ作成
ハンズオン通りに「index.html」を作成したのち、zipで圧縮します。圧縮したzipはドラッグアンドドロップします。
デプロイが終わると[Domain]の下にURLが表示されます。URLをクリックすると"Hello, World"とだけ表示するページが開きます。
[2] Lambdaで関数作成
[3] API GatewayでREST APIを作成
[3-1] REST APIの作成
エンドポイントタイプは、ハンズオンでは[エッジ最適化]を選択するよう促しています。ただ、同じリージョン内で試す分には[リージョン]でも問題ありません。
[3-2] POSTメソッドの作成
[3-3] CORSの有効化
[3-4] APIのデプロイ
デプロイ後に表示されるURLは後で使います。ウェブアプリがAPIにアクセスするためのURLになります。
[3-5] テスト
[4] DynamoDB テーブルを作成
[4-1] DynamoDB テーブルを作成
ARNはこの後、IAMポリシーを追加する際に使用します。
[4-2] IAMポリシーをLambda関数に追加
ハンズオンに記載された内容をコピーし、"Resource"の箇所を作成したDynamoDBのARNに置き換えます。
[4-3] Lambda関数を変更
ハンズオンに記載されたソースコードをコピーし、[Deploy][Test]を実行します。
DynamoDBの画面で作成したテーブルの[項目]タブを確認すると、新しい項目が追加されています。
[5] ウェブアプリからデータ登録
index.htmlをハンズオンに記載された内容に更新します。更新後、再度zip圧縮してAmplifyの画面にドラッグ&ドロップします。自動でデプロイされたら、Domain欄のURLをクリックします。
ブラウザに名前を入力する画面が表示される。名前を適当に入力したのち[Call API]をクリックします。
APIの実行が上手くいくと、ダイアログが表示されます。
DynamoDBの画面を確認すると、ウェブアプリから登録した項目が追加されています。
終わりに
ハンズオンが分かりやすかったこともあり、簡単にウェブアプリケーションを作成できました。ハンズオン通りにやれば上手くいくのですが、備忘録も兼ねて記事を書きました。
出典
- アイキャッチはGerd AltmannによるPixabayからの画像
【AWS】HTTP API+Lambda+DynamoDBのチュートリアルをやってみた
API Gatewayのチュートリアルの中に「Lambda と DynamoDB を使用した CRUD API の構築」があったのでやってみました。HTTP APIを使用するチュートリアルです。
[1] DynamoDBテーブルの作成
idをプライマリキーに持つテーブルを作成します。
[2] Lambda関数の作成
チュートリアルは「Node.js」ですが、私は「Python」で作成しました。
DynamoDBへのアクセス権限を設定します。ポリシーテンプレートから「シンプルなマイクロサービスのアクセス権限」を選択します。
関数の作成後、チュートリアルのソースコードをPython用に変更します。
import json import boto3 from decimal import Decimal # DynamoDBのテーブルにアクセス dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('http-crud-tutorial-items') # Decimal型をJSONに変換するための関数 def json_serialize(obj): if isinstance(obj, Decimal): return float(obj) raise TypeError # Lambda関数のエントリーポイント def lambda_handler(event, context): statusCode = 200 headers = { 'Content-Type': 'application/json' } try: routeKey = event['routeKey'] if routeKey == 'DELETE /items/{id}': id = event['pathParameters']['id'] table.delete_item(Key={'id': id}) body = f"Deleted item {id}" elif routeKey == 'GET /items/{id}': id = event['pathParameters']['id'] body = table.get_item(Key={'id': id}) elif routeKey == 'GET /items': body = table.scan() elif routeKey == 'PUT /items': request = json.loads(event['body']) table.put_item(Item={ 'id': request['id'], 'price': request['price'], 'name': request['name'] }) body = f"Put item {request['id']}" else: raise ValueError(f"Unsupported route: {routeKey}") except Exception as err: statusCode = 400 body = err finally: body = json.dumps(body, default=json_serialize) return { 'statusCode': statusCode, 'body': body, 'headers': headers }
「Decimal型をJSONに変換するための関数」は以下の記事を参考にさせていただきました。
python3 で Decimal を JSON に変換 - Qiita
[3] HTTP APIを作成
統合から「Lambda」を選択し、Lambda関数は先ほど作成した関数の名称を入力します。
ルートは以下の4つを設定します。
- "GET /items/{id}":1つの項目を取得
- "GET /items":すべての項目を取得
- "DELETE /items/{id}":1つの項目を削除
- "PUT /items":1つの項目を追加
ステージはデフォルトのままとします。
APIの作成後に表示されるURLは、APIを実際に使うときに使用します。
[4] APIをテスト
[4-1] 項目を追加(PUT)
次のコマンドを実行します。[APIのURL]は自身が作成APIのURLに置き換えます。
curl -v -X "PUT" -H "Content-Type: application/json" -d ¥ "{\"id\": \"abcdef234\", \"price\": 12345, \"name\": \"myitem\"}" ¥ [APIのURL]/items
コマンド実行に成功すると、以下のような応答が返ってきます。
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)! * We are completely uploaded and fine < HTTP/2 200 < date: Sun, 11 Apr 2021 07:36:31 GMT < content-type: application/json < content-length: 20 < apigw-requestid: dm8H5jP6NjMEJ5g= < * Connection #0 to host [APIのURL] left intact "Put item abcdef234"* Closing connection 0
[4-2] すべての項目を取得(GET)
次のコマンドを実行します。
curl -v [APIのURL]/items
コマンド実行に成功すると、以下のような応答が返ってきます。
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Sun, 11 Apr 2021 07:40:48 GMT < content-type: application/json < content-length: 515 < apigw-requestid: dm8wCh7itjMEP1w= < * Connection #0 to host [APIのURL] left intact {"Items": [{"price": 12345.0, "id": "abcdef234", "name": "myitem"}], "Count": 1, "ScannedCount": 1, "ResponseMetadata": {"RequestId": "VB23I48FNE4DLDH2F86H9IRHDVVV4KQNSO5AEMVJF66Q9ASUAAJG", "HTTPStatusCode": 200, "HTTPHeaders": {"server": "Server", "date": "Sun, 11 Apr 2021 07:40:48 GMT", "content-type": "application/x-amz-json-1.0", "content-length": "107", "connection": "keep-alive", "x-amzn-requestid": "VB23I48FNE4DLDH2F86H9IRHDVVV4KQNSO5AEMVJF66Q9ASUAAJG", "x-amz-crc32": "1550053751"}, "RetryAttempts": 0}}* Closing connection 0
[4-3] 1つの項目を取得(GET)
次のコマンドを実行します。
curl -v [APIのURL]/items/abcdef234
コマンド実行に成功すると、すべての項目を取得したときと似たような結果が返ってきます。
[4-4] 1つの項目を削除(DELETE)
次のコマンドを実行します。
curl -v -X "DELETE" [APIのURL]/items/abcdef234
コマンド実行に成功すると、以下のような応答が返ってきます。
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Sun, 11 Apr 2021 07:45:54 GMT < content-type: application/json < content-length: 24 < apigw-requestid: dm9f8iGMNjMEPbA= < * Connection #0 to [APIのURL] left intact "Deleted item abcdef234"* Closing connection 0
[5] リソースの削除
以下のリソースを削除したら終了です。
- DynamoDBテーブル
- HTTP API
- Lambda関数
- Lambda関数のロググループ
- Lambda関数の実行ロール
終わりに
Node.jsをPythonに置き換えるところは時間がかかりましたが、それ以外はスムーズに行うことができました。今回は、curlコマンドでAPIにアクセスしたため、煩雑に感じました。ですが、ブラウザなどからUI経由でアクセスできるようにすれば、非常にお手軽で便利だなと思います。
出典
- アイキャッチはGerd AltmannによるPixabayからの画像
【AWS】LambdaのHTTP API起動を15分で試す
今回は、AWS LambdaをHTTP API経由で起動します。公式のデベロッパーガイドを参考に15分で構築・起動・削除まで行いました。
[1] APIの種類
2021年5月時点では以下の4種類です。
APIの種類 | 概要 |
---|---|
HTTP API | コア機能のみ限定している代わりに低コスト |
WebSocket API | チャットアプリケーションなど双方向通信用 |
REST API | HTTP APIより多機能 |
REST API プライベート | REST APIのVPC内アクセス限定版 |
[2] 15分でHTTP APIを試す
のデベロッパーガイド通りに、HTTP APIを試します。所要時間10〜20分程度で、作成から削除までの一連の流れが試せます。
[2-1] 関数の作成
一から作成を選び、関数名とランタイムを選択して、関数を作成します。
"Hello, from Lambda"を返すだけの関数が作成されます。
[2-2] APIの構築
API Gatewayの画面から、HTTP APIを構築します。
統合から「Lambda」を選択して関数名を設定します。API名を入力し次へ進みます。
ルートはデフォルトのままにしました。
ステージもデフォルトのままです。
[2-3] APIのテスト
APIの作成後に表示されるURLをコピーします。
以下のURLをブラウザに入力し、"Hello, from Lambda"が表示されればAPIのテストは終了です。
[APIのURL]/my-function
[2-4] 削除
APIを削除します。
Lambda関数を削除します。
CloudWatchの画面からロググループを削除します。
IAMの画面からロールを削除します。
終わりに
非常に簡素な機能ではありますが、HTTP APIの構築から削除までを試すことができました。
AWS Lambdaを初めて使う方法や、スケジュール起動については以下の記事にまとめています。
https://predora005.hatenablog.com/entry/2021/05/02/190000predora005.hatenablog.com
https://predora005.hatenablog.com/entry/2021/05/05/190000predora005.hatenablog.com
出典
- アイキャッチはGerd AltmannによるPixabayからの画像
*1:Gerd AltmannによるPixabayからの画像
【AWS】Lambdaをスケジュール起動する方法
今回は、AWS Lambdaで作成した関数をスケジュール起動する方法に挑戦しました。前回作成したHello, Worldを3分周期で起動させますす。
https://predora005.hatenablog.com/entry/2021/05/02/190000predora005.hatenablog.com
[1] トリガーの追加
Lambdaの画面から[トリガーを追加]を選択します。
トリガーの種類の中から「EventBridge (CloudWatch Events)」を選択します。ルール名は任意でOKです。
ルールタイプを「スケジュール式」にし、スケジュール式に「rate(3 minitus)」を入力します。入力が終わったら[追加]を押します。
これですぐに3分周期の起動が開始されます。
[2] ログで確認
ちゃんと3分周期で起動されているのかログで確認します。問題なく起動されているのが確認できました。
CloudWatchでログを確認しても、3分周期で起動されていることが分かります。
終わりに
スケジュール起動は非常に簡単で、5分もあれば設定できることが分かりました。今回使ったのはrate式ですが、cronを使えば指定時刻での起動もできます。色々な場面で使えそうです。
出典
- アイキャッチはGerd AltmannによるPixabayからの画像
【AWS】Lambdaの使い方や料金(初めて使うとき気になったこと)
「AWS Lambda」はAWSのサーバーレスコンピューティングサービスです。
定期的に実行する処理や、イベントで起動する処理を作りたいと思い、使ってみることにしました。例えば、1日に1回株価のチャート分析をしたり、Webアプリからの入力があったらデータベースに登録したり等です。
初めて使うにあたり、気になる料金や使い方をまとめました。使い方はPythonでの使い方を紹介しています。
[1] 料金
初めて使う際に動作確認程度で使用する場合、料金を気にする必要はありません。AWS Lambdaの料金は「割り当てるメモリ」「リクエスト数」「実行時間」で決まります。
- 100万リクエストあたり $0.20
- 1GBメモリ1秒実行当たり $0.0000166667
しかし、無料枠が設けられています。
- 1 か月ごとに 100 万リクエスト / 1ヶ月
- 1GBメモリ40万秒の実行時間 / 1ヶ月
実行時間としては、1ヶ月あたり以下を下回れば無料で使い続けられます。
メモリ | 無料枠終了までの実行時間 |
---|---|
128MB | 888時間 |
512MB | 222時間 |
1GB | 111時間 |
4GB | 28時間 |
個人で試しに使う分には、無料枠の範囲内で済みそうです。
[2] Hello, World
まずは、Hello, Worldを返すだけのコードを作りました。ちなみに、公式のチュートリアルにもHello, Worldの実行手順が載っています。しかし、少し内容が古いので細かい点はアレンジした方が良さそうです。
[2-1] 関数の作成(Python)
まずは、関数を作成します。
今回は「一から作成」を選びます。
任意の関数名を入力し、ランタイムをPythonに変更して[関数の作成]を押下します。
以上で、関数の作成は終了です。
[2-2] Hello, Worldを実行する
Hello, Worldのソースコードが自動で作成されているので、[Test]を押して早速実行してみます。
テストを実行するためには、イベントの設定が必要です。ここではイベント名はデフォルトのまま作成します。
実行後に実行結果が表示されます。「Response」が呼び出し元に返す結果、「Function Logs」がログです。
[2-3] ソースコードの変更
引数として受け取っている「event」と「context」の中身をprint文でログに出力してみます。ソースコードの変更後は[Deply]を押して変更を反映します。
反映されると"Changes deployed"の表示に変わります。
実行してみると「Function Logs」にeventとcontextの中身が出力されています。
contextの詳細は以下に載っています。
Python の AWS Lambda context オブジェクト - AWS Lambda
[2-4] ログの確認
[モニタリング]タブの[ログ]をクリックすると、これまでに登録されたログが表示されます。そのうちの一つをクリックすると、Cloud Watchの画面に移動します。
Lambdaの実行結果(ログ)は、Cloud Watchに登録されるようになっています。
終わりに
料金と簡単な使い方を紹介しました。AWS Lambdaは上手に使えば、色々なことに有効活用できそうです。どのような使い方があるのか今後も調べていきたいと思います。
出典
- アイキャッチはGerd AltmannによるPixabayからの画像
【AWS】IAMユーザのパスワードが切れたときの復旧方法
AWSに久々にログインしようとしたところ「パスワードの有効期限が切れました。管理者に連絡してパスワードの再設定を行ってください。」と表示されてしまいました。
IAMユーザのパスワード有効期限が切れた場合は、rootユーザで復旧します。
rootユーザでコンソールにサインインし、IAMの画面を開きます。パスワードが切れたユーザを選択し[認証情報]タブの[コンソールのパスワード]の[管理]をクリックします。
[パスワードの設定]を「自動生成パスワード」か「カスタムパスワード」にします。どちらでも構いません。
[パスワードのリセットが必要]ば任意です。必要に応じてチェックしてください。
適用すると、新しいパスワードが取得できます。控えるのを忘れないようにしましょう。
新しいパスワードで再度サインインすると無事に認証が通りました。