どこにでもいる30代SEの学習ブログ

主にプログラミング関連の学習内容。読んだ本の感想や株式投資についても書いてます。

【AWS】LambdaをS3トリガーで起動する方法

API Lambdaのチュートリアルの中に「AmazonS3トリガーを使用してLambda関数を呼び出す」があったのでやってみました。

docs.aws.amazon.com

[1] S3バケットを作成

まずは、S3バケットを作成します。

f:id:predora005:20210411185619p:plain

バケット作成時、特に注意することはありません。

f:id:predora005:20210411185623p:plain

バケット作成後、ファイルをアップロードしておきます。本記事では「test.png」としています。

f:id:predora005:20210411191236p:plain

[2] Lambda関数を作成

「設計図の使用」を選択し、設計図の中から「s3-get-object-pythonを選択します。

f:id:predora005:20210411192704p:plain

実行ロールはAWSポリシーテンプレートから新しいロールを作成」を選択します。ポリシーテンプレートの中から「Amazon S3オブジェクトの読み取り専用アクセス権限」を選びます。

f:id:predora005:20210411192710p:plain

S3トリガーに先ほど作成したバケットの名称を入力します。他はデフォルトのままにしておきます。

f:id:predora005:20210411192717p:plain

[3] テスト

Lambda関数の作成後、テストイベントを作成します。テンプレートから「s3-put」を選びます。

f:id:predora005:20210411195146p:plain

テンプレート内の「example-bucketを作成したS3バケットのARNに変更します。また、「test/key」アップロードしたファイル名(本記事でっはtest.png)に変更します。

f:id:predora005:20210411195153p:plain

テストイベント作成後、テストを実行します。上手くいくと次のような実行結果になります。

f:id:predora005:20210411195157p:plain

[4] S3バケットにアップロード

次に、S3バケットに新たなファイルをアップロードしてみます。test2.png, test3.jpg, test4.jpgをアップロードしました。

f:id:predora005:20210411195554p:plain

CloudWatchでLambda関数のログを見ると「image/png」「image/jpeg」が登録されたことが登録されています。

f:id:predora005:20210411195601p:plain

[5] リソースの削除

次のリソースを削除します。

  • Lambda関数
  • Lambda関数のロググループ
  • IAMポリシー
  • IAMロール
  • S3バケット

終わりに

チュートリアル通りに試して、無事にS3をトリガーとしてLambda関数が起動されました。今回はアップロードされたファイルの種類を返すだけという簡単なものでした。次回は少し実践的な内容にトライしてみたいと思います。

出典

【AWS】30分で簡単なウェブアプリケーション構築(Amplify+Lambda+DynamoDB)

AWS公式のハンズオン「AWS で基本的なウェブアプリケーションを構築する」を見て、簡単なウェブアプリケーションを構築しました。

aws.amazon.com

構築方法はハンズオンを見れば、ほとんど分かります。ところどころハンズオン通りに行かないところがあったので、実際にやったときの様子を補足を交えつつ紹介します。

[1] Amplifyでウェブアプリ作成

f:id:predora005:20210410220328p:plain

f:id:predora005:20210410220333p:plain

ハンズオン通りに「index.html」を作成したのち、zipで圧縮します。圧縮したzipはドラッグアンドドロップします。

f:id:predora005:20210410220340p:plain

デプロイが終わると[Domain]の下にURLが表示されます。URLをクリックすると"Hello, World"とだけ表示するページが開きます。

f:id:predora005:20210410220346p:plain

[2] Lambdaで関数作成

f:id:predora005:20210410221137p:plain

f:id:predora005:20210410221142p:plain

f:id:predora005:20210410221148p:plain

f:id:predora005:20210410221207p:plain

[3] API GatewayREST APIを作成

[3-1] REST APIの作成

f:id:predora005:20210410221705p:plain

エンドポイントタイプは、ハンズオンでは[エッジ最適化]を選択するよう促しています。ただ、同じリージョン内で試す分には[リージョン]でも問題ありません。

f:id:predora005:20210410221710p:plain

[3-2] POSTメソッドの作成

f:id:predora005:20210410222633p:plain

f:id:predora005:20210410222639p:plain

f:id:predora005:20210410222644p:plain

[3-3] CORSの有効化

f:id:predora005:20210410223307p:plain

f:id:predora005:20210410222742p:plain

[3-4] APIのデプロイ

f:id:predora005:20210410222938p:plain

f:id:predora005:20210410222942p:plain

デプロイ後に表示されるURLは後で使います。ウェブアプリがAPIにアクセスするためのURLになります。

f:id:predora005:20210410222946p:plain

[3-5] テスト

f:id:predora005:20210410223716p:plain

f:id:predora005:20210410223722p:plain

f:id:predora005:20210410223726p:plain

[4] DynamoDB テーブルを作成

[4-1] DynamoDB テーブルを作成

f:id:predora005:20210410224021p:plain

ARNはこの後、IAMポリシーを追加する際に使用します。

f:id:predora005:20210410224027p:plain

[4-2] IAMポリシーをLambda関数に追加

f:id:predora005:20210410225300p:plain

f:id:predora005:20210410225305p:plain

ハンズオンに記載された内容をコピーし、"Resource"の箇所を作成したDynamoDBのARNに置き換えます。

f:id:predora005:20210410225310p:plain

f:id:predora005:20210410225315p:plain

[4-3] Lambda関数を変更

ハンズオンに記載されたソースコードをコピーし、[Deploy][Test]を実行します。

f:id:predora005:20210410225701p:plain

DynamoDBの画面で作成したテーブルの[項目]タブを確認すると、新しい項目が追加されています。

f:id:predora005:20210410225707p:plain

[5] ウェブアプリからデータ登録

index.htmlをハンズオンに記載された内容に更新します。更新後、再度zip圧縮してAmplifyの画面にドラッグ&ドロップします。自動でデプロイされたら、Domain欄のURLをクリックします。

f:id:predora005:20210410230511p:plain

ブラウザに名前を入力する画面が表示される。名前を適当に入力したのち[Call API]をクリックします。

f:id:predora005:20210410230516p:plain

APIの実行が上手くいくと、ダイアログが表示されます。

f:id:predora005:20210410230520p:plain

DynamoDBの画面を確認すると、ウェブアプリから登録した項目が追加されています。

f:id:predora005:20210410230523p:plain

終わりに

ハンズオンが分かりやすかったこともあり、簡単にウェブアプリケーションを作成できました。ハンズオン通りにやれば上手くいくのですが、備忘録も兼ねて記事を書きました。

出典

【AWS】HTTP API+Lambda+DynamoDBのチュートリアルをやってみた

API Gatewayチュートリアルの中に「Lambda と DynamoDB を使用した CRUD API の構築」があったのでやってみました。HTTP APIを使用するチュートリアルです。

docs.aws.amazon.com

[1] DynamoDBテーブルの作成

idをプライマリキーに持つテーブルを作成します。

f:id:predora005:20210411160705p:plain

[2] Lambda関数の作成

チュートリアルは「Node.js」ですが、私は「Python」で作成しました。

f:id:predora005:20210411161204p:plain

DynamoDBへのアクセス権限を設定します。ポリシーテンプレートから「シンプルなマイクロサービスのアクセス権限」を選択します。

f:id:predora005:20210411161209p:plain

関数の作成後、チュートリアルソースコード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を作成

APIタイプから「HTTP API」を選択します。

f:id:predora005:20210411162406p:plain

統合から「Lambda」を選択し、Lambda関数は先ほど作成した関数の名称を入力します。

f:id:predora005:20210411162412p:plain

ルートは以下の4つを設定します。

  • "GET /items/{id}":1つの項目を取得
  • "GET /items":すべての項目を取得
  • "DELETE /items/{id}":1つの項目を削除
  • "PUT /items":1つの項目を追加

f:id:predora005:20210411162419p:plain

ステージはデフォルトのままとします。

f:id:predora005:20210411162424p:plain

APIの作成後に表示されるURLは、APIを実際に使うときに使用します。

f:id:predora005:20210411163439p:plain

[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経由でアクセスできるようにすれば、非常にお手軽で便利だなと思います。

出典

【AWS】LambdaのHTTP API起動を15分で試す

f:id:predora005:20210411020120j:plain
*1

今回は、AWS LambdaをHTTP API経由で起動します。公式のデベロッパーガイドを参考に15分で構築・起動・削除まで行いました。

docs.aws.amazon.com

[1] APIの種類

2021年5月時点では以下の4種類です。

APIの種類 概要
HTTP API コア機能のみ限定している代わりに低コスト
WebSocket API チャットアプリケーションなど双方向通信用
REST API HTTP APIより多機能
REST API プライベート REST APIVPC内アクセス限定版

[2] 15分でHTTP APIを試す

デベロッパーガイド通りに、HTTP APIを試します。所要時間10〜20分程度で、作成から削除までの一連の流れが試せます。

[2-1] 関数の作成

一から作成を選び、関数名とランタイムを選択して、関数を作成します。

f:id:predora005:20210411101321p:plain

"Hello, from Lambda"を返すだけの関数が作成されます。

f:id:predora005:20210411101326p:plain

[2-2] APIの構築

API Gatewayの画面から、HTTP APIを構築します。

f:id:predora005:20210411101616p:plain

統合から「Lambda」を選択して関数名を設定します。API名を入力し次へ進みます。

f:id:predora005:20210411101620p:plain

ルートはデフォルトのままにしました。

f:id:predora005:20210411101626p:plain

ステージもデフォルトのままです。

f:id:predora005:20210411101631p:plain

[2-3] APIのテスト

APIの作成後に表示されるURLをコピーします。

f:id:predora005:20210411101843p:plain

以下のURLをブラウザに入力し、"Hello, from Lambda"が表示されればAPIのテストは終了です。

[APIのURL]/my-function

[2-4] 削除

APIを削除します。

f:id:predora005:20210411102123p:plain

Lambda関数を削除します。

f:id:predora005:20210411102127p:plain

CloudWatchの画面からロググループを削除します。

f:id:predora005:20210411102131p:plain

IAMの画面からロールを削除します。

f:id:predora005:20210411102135p:plain

終わりに

非常に簡素な機能ではありますが、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

出典

*1:Gerd AltmannによるPixabayからの画像

【AWS】Lambdaをスケジュール起動する方法

今回は、AWS Lambdaで作成した関数をスケジュール起動する方法に挑戦しました。前回作成したHello, Worldを3分周期で起動させますす。

https://predora005.hatenablog.com/entry/2021/05/02/190000predora005.hatenablog.com

[1] トリガーの追加

Lambdaの画面から[トリガーを追加]を選択します。

f:id:predora005:20210411014225p:plain

トリガーの種類の中から「EventBridge (CloudWatch Events)」を選択します。ルール名は任意でOKです。

f:id:predora005:20210411014229p:plain

ルールタイプを「スケジュール式」にし、スケジュール式に「rate(3 minitus)」を入力します。入力が終わったら[追加]を押します。

f:id:predora005:20210411014233p:plain

これですぐに3分周期の起動が開始されます。

f:id:predora005:20210411014237p:plain

[2] ログで確認

ちゃんと3分周期で起動されているのかログで確認します。問題なく起動されているのが確認できました。

f:id:predora005:20210411014241p:plain

CloudWatchでログを確認しても、3分周期で起動されていることが分かります。

f:id:predora005:20210411014246p:plain

終わりに

スケジュール起動は非常に簡単で、5分もあれば設定できることが分かりました。今回使ったのはrate式ですが、cronを使えば指定時刻での起動もできます。色々な場面で使えそうです。

出典

【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時間

個人で試しに使う分には、無料枠の範囲内で済みそうです。

料金 - AWS Lambda |AWS

[2] Hello, World

まずは、Hello, Worldを返すだけのコードを作りました。ちなみに、公式のチュートリアルにもHello, Worldの実行手順が載っています。しかし、少し内容が古いので細かい点はアレンジした方が良さそうです。

[2-1] 関数の作成(Python)

まずは、関数を作成します。

f:id:predora005:20210410145057p:plain

今回は「一から作成」を選びます。

f:id:predora005:20210410145102p:plain

任意の関数名を入力し、ランタイムをPythonに変更して[関数の作成]を押下します。

f:id:predora005:20210410145108p:plain

以上で、関数の作成は終了です。

f:id:predora005:20210410151521p:plain

[2-2] Hello, Worldを実行する

Hello, Worldのソースコードが自動で作成されているので、[Test]を押して早速実行してみます。

f:id:predora005:20210410151545p:plain

テストを実行するためには、イベントの設定が必要です。ここではイベント名はデフォルトのまま作成します。

f:id:predora005:20210410151551p:plain

実行後に実行結果が表示されます。「Response」が呼び出し元に返す結果、「Function Logs」がログです。

f:id:predora005:20210410151556p:plain

[2-3] ソースコードの変更

引数として受け取っている「event」と「context」の中身をprint文でログに出力してみます。ソースコードの変更後は[Deply]を押して変更を反映します。

f:id:predora005:20210410152455p:plain

反映されると"Changes deployed"の表示に変わります。

f:id:predora005:20210410152501p:plain

実行してみると「Function Logs」にeventとcontextの中身が出力されています。

f:id:predora005:20210410152504p:plain

contextの詳細は以下に載っています。

Python の AWS Lambda context オブジェクト - AWS Lambda

[2-4] ログの確認

[モニタリング]タブの[ログ]をクリックすると、これまでに登録されたログが表示されます。そのうちの一つをクリックすると、Cloud Watchの画面に移動します。

f:id:predora005:20210410154526p:plain

Lambdaの実行結果(ログ)は、Cloud Watchに登録されるようになっています。

f:id:predora005:20210410154532p:plain

終わりに

料金と簡単な使い方を紹介しました。AWS Lambdaは上手に使えば、色々なことに有効活用できそうです。どのような使い方があるのか今後も調べていきたいと思います。

出典

【AWS】IAMユーザのパスワードが切れたときの復旧方法

AWSに久々にログインしようとしたところ「パスワードの有効期限が切れました。管理者に連絡してパスワードの再設定を行ってください。」と表示されてしまいました。

IAMユーザのパスワード有効期限が切れた場合は、rootユーザで復旧します。

f:id:predora005:20210331233435p:plain

rootユーザでコンソールにサインインし、IAMの画面を開きます。パスワードが切れたユーザを選択し[認証情報]タブの[コンソールのパスワード]の[管理]をクリックします。

f:id:predora005:20210331232437p:plain

[パスワードの設定]を「自動生成パスワード」か「カスタムパスワード」にします。どちらでも構いません。

[パスワードのリセットが必要]ば任意です。必要に応じてチェックしてください。

f:id:predora005:20210331232845p:plain

適用すると、新しいパスワードが取得できます。控えるのを忘れないようにしましょう。

f:id:predora005:20210331232859p:plain

新しいパスワードで再度サインインすると無事に認証が通りました。

f:id:predora005:20210331233247p:plain

参考資料

AWS アカウントのパスワードを復旧する