モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

AWS Lambda の基本的な使い方

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2017/09/27
最終更新最終更新
2020/01/18
記事区分記事区分
一般公開

目次

    サーバーレスとDevOpsに注力中。AWSを使った効率的なインフラ構築が得意です。

    AWS Lambda はイベントドリブンな「関数」を登録できるサービスです。例えば S3 に画像がアップロードされたときにサムネイル用のサイズに加工する処理が記述された関数を登録できます。基本的な使い方をまとめます。

    事前準備

    関数の登録はブラウザで AWS コンソールにログインして行うこともできますが、本ページでは AWS CLI コマンドで行うことにします。専用の IAM を新規に登録して、AWSLambdaFullAccess など AWS Lambda に関する Permission を Attach します。以下のように ~/.aws/credentials ファイルに認証情報を設定します。

    [default]
    ...
    
    [lambda-test-user-20170929]
    aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
    aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    region = ap-northeast-1
    

    正常に設定されていれば以下のコマンドで空の結果が返されます。

    $ aws lambda list-functions --profile lambda-test-user-20170929
    {
        "Functions": []
    }
    

    list-functions の他に以下のようなサブコマンドが利用できます。

    関数のコーディング方法について

    具体例を通して AWS Lambda 関数のコーディング方法を把握します。

    S3 が Lambda を実行

    ここでは Node.js を利用することにします。こちらのページなどを参照してインストールしてから以下のコマンドを実行します。

    ディレクトリの作成

    mkdir examplefolder
    cd examplefolder
    

    パッケージのローカルインストール

    npm install async gm
    

    後述の「関数」を記述する JS ファイルの作成

    touch CreateThumbnail.js
    vi CreateThumbnail.js
    

    デプロイパッケージの作成

    zip -r CreateThumbnail.zip CreateThumbnail.js node_modules/
    

    CreateThumbnail.js

    // 依存ライブラリ
    var util = require('util');
    var async = require('async');
    var gm = require('gm').subClass({ imageMagick: true });
    var AWS = require('aws-sdk');
    var s3 = new AWS.S3();
    
    // 定数定義
    var MAX_WIDTH = 100;
    var MAX_HEIGHT = 100;
    
    exports.handler = function(event, context, callback) {
    
      // S3 から渡される情報を CloudWatch にログ出力
      // https://nodejs.org/dist/latest-v6.x/docs/api/util.html#util_util_inspect_object_options
      console.log("Reading options from event:\n", util.inspect(event, {depth: 5}));
    
      // 入力バケットと出力バケット
      // '+' を ' ' に置換してから URI デコーディング
      var srcBucket = event.Records[0].s3.bucket.name;
      var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
      var dstBucket = srcBucket + "resized";
      var dstKey = "resized-" + srcKey;
    
      // 再帰が発生して無限ループにならないようにチェック (リサイズ結果をリサイズ。その結果をリサイズ。その...)
      if (srcBucket == dstBucket) {
        callback("Source and destination buckets are the same.");
        return;
      }
    
      // 正規表現で画像の拡張子を特定
      var typeMatch = srcKey.match(/\.([^.]*)$/);
      if (!typeMatch) {
        callback("Could not determine the image type.");
        return;
      }
      var imageType = typeMatch[1];
      if (imageType != "jpg" && imageType != "png") {
        callback('Unsupported image type: ${imageType}');
        return;
      }
    
      // 「ダウンロード、リサイズ、アップロード」の一連の処理を非同期実行
      // 結果を CloudWatch にログ出力 https://caolan.github.io/async/docs.html#waterfall
      async.waterfall([
        function download(next) {
          // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
          s3.getObject({
            Bucket: srcBucket,
            Key: srcKey
          }, next);
        },
        function transform(response, next) {
          // https://github.com/aheckmann/gm
          gm(response.Body).size(function(err, size) {
            // `MAX_WIDTH` または `MAX_HEIGHT` まで引き伸ばす
            var scalingFactor = Math.min(
              MAX_WIDTH / size.width,
              MAX_HEIGHT / size.height
            );
            var width  = scalingFactor * size.width;
            var height = scalingFactor * size.height;
    
            this.resize(width, height)
              .toBuffer(imageType, function(err, buffer) {
                if (err) {
                  next(err);
                }
                else {
                  next(null, response.ContentType, buffer);
                }
              });
          });
        },
        function upload(contentType, data, next) {
          // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
          s3.putObject({
            Bucket: dstBucket,
            Key: dstKey,
            Body: data,
            ContentType: contentType
          }, next);
        }], function(err) {
          // 非同期処理が完了した後に実行されるコールバック関数
          if (err) {
            console.error(
              'Unable to resize ' + srcBucket + '/' + srcKey +
              ' and upload to ' + dstBucket + '/' + dstKey +
              ' due to an error: ' + err
            );
          }
          else {
            console.log(
              'Successfully resized ' + srcBucket + '/' + srcKey +
              ' and uploaded to ' + dstBucket + '/' + dstKey
            );
          }
          // S3 に結果を返す
          callback(null, "message");
        }
      );
    };
    

    Lambda 関数に付与する IAM ロールの作成

    AWS IAM コンソールで新規 Role を作成して以下の Policy を Attach します。S3 に対する Put/Get アクセスおよび CloudWatch ログのすべての権限が付与されます。

    • ロール名 lambda-s3-execution-role
    • ポリシー AWSLambdaExecute

    Lambda 関数の登録

    以下の create-function コマンドで zip ファイル ./CreateThumbnail.zip をアップロードします。作成したロールの Amazon Resource Name (ARN) を設定して Lambda 関数を実行するときに利用できるようにします。--profileaws lambda ではなく aws のためのオプションです。create-function するために事前準備で AWSLambdaFullAccess を付与した IAM を指定します。

    aws lambda create-function \
    --profile lambda-test-user-20170929 \
    --region ap-northeast-1 \
    --function-name CreateThumbnail \
    --zip-file fileb://CreateThumbnail.zip \
    --role arn:aws:iam::123412341234:role/lambda-s3-execution-role \
    --handler CreateThumbnail.handler \
    --runtime nodejs6.10 \
    --timeout 10 \
    --memory-size 1024
    

    Lambda 関数のテスト実行

    S3 バケットを二つ作成して mysourcebucket20170930 バケットに適当な画像 HappyFace.jpg をアップロードします。

    • mysourcebucket20170930
    • mysourcebucket20170930resized

    以下の invoke コマンドによって IAM lambda-test-user-20170929 の権限で Lambda 関数をテスト実行します。実際には S3 から渡される --payload 情報は ./input.txt で指定します。output.txt には callback() で S3 に返される情報が格納されます。

    aws lambda invoke \
    --profile lambda-test-user-20170929 \
    --invocation-type RequestResponse \
    --function-name CreateThumbnail \
    --region ap-northeast-1 \
    --payload file://input.txt \
    output.txt
    

    input.txt (参考: eventsources-s3-put)

    {
      "Records":[
        {
          "eventVersion":"2.0",
          "eventSource":"aws:s3",
          "awsRegion":"ap-northeast-1", ★変更箇所
          "eventTime":"1970-01-01T00:00:00.000Z",
          "eventName":"ObjectCreated:Put",
          "userIdentity":{
            "principalId":"AIDAJDPLRKLG7UEXAMPLE"
          },
          "requestParameters":{
            "sourceIPAddress":"127.0.0.1"
          },
          "responseElements":{
            "x-amz-request-id":"C3D13FE58DE4C810",
            "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
          },
          "s3":{
            "s3SchemaVersion":"1.0",
            "configurationId":"testConfigRule",
            "bucket":{
              "name":"mysourcebucket20170930", ★変更箇所
              "ownerIdentity":{
                "principalId":"A3NL1KOZZKExample"
              },
              "arn":"arn:aws:s3:::mysourcebucket20170930" ★変更箇所
            },
            "object":{
              "key":"HappyFace.jpg", ★変更箇所
              "size":1024,
              "eTag":"d41d8cd98f00b204e9800998ecf8427e",
              "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko"
            }
          }
        }
      ]
    }
    

    S3 から Lambda 関数を実行するための設定

    以下の add-permission コマンドで Lambda 関数に対して許可設定 policy を追加します。--source-account が保有する --source-arn バケットから関数を実行できるようになります。

    aws lambda add-permission \
    --profile lambda-test-user-20170929 \
    --function-name CreateThumbnail \
    --region ap-northeast-1 \
    --statement-id some-unique-id-20170930 \
    --action "lambda:InvokeFunction" \
    --principal s3.amazonaws.com \
    --source-arn arn:aws:s3:::mysourcebucket20170930 \
    --source-account 123412341234
    

    正しく設定されたことは get-policy コマンドで確認できます。

    aws lambda get-policy \
    --profile lambda-test-user-20170929 \
    --function-name CreateThumbnail
    

    最後に S3 バケットに対して通知設定「S3 → mysourcebucket20170930 → Properties → Events → Add notification」を追加します。

    • Name MyNotification20170930
    • Events ObjectCreate (All)
    • Send to Lambda Function
    • Lambda CreateThumbnail

    mysourcebucket20170930 バケットに画像ファイルをアップロードすると、リサイズされて mysourcebucket20170930resized バケットに保存されるようになります。

    参考資料

    上記具体例で概要を把握した AWS Lambda を用いて開発を行う際に必要となる、詳細情報が記載された資料へのリンク集です。

    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    サーバーレスとDevOpsに注力中。AWSを使った効率的なインフラ構築が得意です。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • AWS EC2 インスタンスの選定方法
        準仮想化と完全仮想化 AWS のインスタンスタイプが準仮想化と完全仮想化のどちらの仮想化技術を採用したハードウェアであるかによって、使用できる AMI (OS) が異なるのは以下の理由によります。 準仮想化 ParaVirtualization (PV) において OS は自分が仮想化用のハードウェア上で動作していることを知っています。つまり仮想化用にカスタマイズされた専用の OS が必要になりま...
        yuki_coderyuki_coder8/30/2017に更新
        いいねアイコン画像0
      • OpenVPN で二つの VPC をつなぐための設定
        インターネット VPN (Virtual Private Network) には二拠点間の通信を暗号化する方式によって IPsec-VPN や SSL-VPN などがあります。OpenVPN は SSL-VPN の実装のひとつです。AWS VPC を二つ用意してそれらを OpenVPN で接続してみます。 VPC の構成 myvpc-1 (10.1.0.0/16) mysubnet-1-1 (10...
        takuyatakuya8/11/2017に更新
        いいねアイコン画像0
      • Windows Server EC2 インスタンスへの CAL インストール
        サムネイル画像-8bae43ea3b
        Windows サーバを AWS EC2 インスタンスとして起動した後は、RDP 接続が必要となります。RDP 接続を行なうためには Remote Desktop Services (RDS) ライセンスが必要となります。 Windows Server のライセンスは、管理用途の RDS 接続を許可しています。その際に RDS ライセンスは不要です。ただし、[同時接続数が 2 という制限があります...
        けんちゃんけんちゃん11/18/2023に更新
        いいねアイコン画像0
      • AWS 落穂拾い (Data Engineering)
        Kinesis Kinesis Streams データは 3 AZ にレプリケーションされます。Amazon Kinesis Data Streams FAQs 24 時間 (既定値) から 1 年までデータ保持できます。[Changing the Data Retention Period](https://docs.aws.amazon
        yuki_coderyuki_coder12/22/2024に更新
        いいねアイコン画像0
      • Windows Server EC2 インスタンスによって Active Directory を構築する設定例
        サムネイル画像-c40f03af4b
        本ページでは Windows Server 自体の設定で AD を構築する例を記載します。 AD の Domain Service (DS) および DNS 役割のインストール 注意 RDS CAL に関連して、AD DC と同じサーバに RDS セッションホストをインストールする場合は、最初に DC をインストールしてから、その後に RDS セッションホストをインストールします。 If you ...
        きらりコードきらりコード11/14/2023に更新
        いいねアイコン画像0