連載
» 2017年06月13日 05時00分 UPDATE

AWS Lambdaで始めるサーバレスアーキテクチャ入門(2):簡単なサーバレスアプリ構築で分かるAWS Lambdaの実装方法の基本 (1/2)

システム開発の常識を覆す「サーバレスアーキテクチャ」について「AWS Lambda」を使って構築方法を学ぶ連載。今回は、サンプルとなるサーバレスアプリケーションの構築を例にAWS Lambdaの実装方法の基本を解説します。

[先崎一樹,三菱総研DCS]

 システム開発の常識を覆す「サーバレスアーキテクチャ」について「AWS Lambda」を使って構築方法を学ぶ本連載「AWS Lambdaで始めるサーバレスアーキテクチャ入門」。前回の「アプリ開発者もインフラ管理者も知っておきたいサーバレスとAWS Lambdaの基礎知識」ではサーバレスアーキテクチャのコンセプトや特徴、そしてAWS Lambdaの概要を紹介しました。

 今回は、サンプルとなるサーバレスアプリケーションの構築を例にAWS Lambdaの実装方法の基本を解説します。

簡単なサーバレスアプリケーションを作ってみよう

 今回は、Amazon S3 バケット(以下、S3 Bucket)にコンテンツをアップロードすると、自動で別のS3 Bucketにコピーするという簡単なサーバレスアプリケーションを構築します。処理の流れは以下の通りです。

図1 サンプルアプリケーション
  1. ユーザーがS3 Bucketにコンテンツをアップロードする
  2. コンテンツアップロードをトリガーに Lambda関数が実行される
  3. 別のS3 Bucketにコンテンツが自動でコピーされる

 それでは、実際にサーバレスアプリケーションを作っていきましょう。構築は以下の流れで行います。

  1. S3 Bucketの作成
  2. IAMロールの作成
  3. Lambda関数の作成
  4. Lambda関数のテスト
  5. イベントトリガーの設定
  6. テスト実行

S3 Bucketの作成

 まずは、AWSのマネジメントコンソールにサインインし、適当な名前で2つのS3 Bucketを作成してください。ここではコンテンツアップロード用の「sample-upload-bucket」とコンテンツコピー先の「sample-copy-bucket」を東京リージョンに作成しました。以降の手順では、S3 Bucketの名前は適宜置き換えてください。

IAMロールの作成

 続いて、Lambda関数で利用するIAMロールを作成します。ロールタイプはAWSサービスロールの中から「AWS Lambda」を選択します。

図2 ロールタイプの選択

 ポリシーには以下2つの権限を付与します。

  • AWSLambdaBasicExecutionRole
  • AmazonS3FullAccess

 ここでは「sample-lambda-role」という名前でIAMロールを作成しました。

Lambda関数の作成

 続いて、S3 Bucketにアップロードされたコンテンツを別のS3 BucketへとコピーするLambda関数を作成します。AWS Lambdaのコンソールを開いてください。Lambda関数を作成したことがない方は、「今すぐ始める」というボタンが表示されているのでクリックします。

図3 AWS Lambdaを今すぐはじめる

 既にLambda関数を作成したことがある方は、「Lambda関数の作成」をクリックします。すると設計図の選択画面が表示されますが、今回blueprintは利用せずブランク関数として作成します。

図4 設計図の選択

 トリガーの設定はAmazon S3から実施するので「次へ」をクリックします。

図5 トリガーの設定

 関数の設定画面が表示されるので、まずはLambda関数に名前を付け説明書きを入力します。ここでは「sample-lambda」としました。また、利用する言語は「Node.js 6.10」とします。

図6 関数の設定

 コードについては、今回は外部モジュールを利用しないのでインラインエディタで編集していきます。以下のコードをコピー&ペーストしてください。その際、変数copyBucketの値は、S3 Bucketの作成で準備したコピー先のS3 Bucketへと修正してください。

'use strict';
 
// AWS SDK モジュールの読み込み
const aws = require('aws-sdk');
const s3 = new aws.S3();
 
exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));
 
  // アップロードされたS3 Bucketの名前とコンテンツのパスを取得
  const uploadBucket = event.Records[0].s3.bucket.name;
  const key = event.Records[0].s3.object.key;
 
  // getObject APIを使用してS3のコンテンツを取得
  const params = {
    Bucket: uploadBucket,
    Key: key
  };
  s3.getObject(params, function(err, data) {
     if (err) {
      console.log(err, err.stack);
      context.done(err, err.stack);
    } else {
      console.log('data: ', data);
 
      // コピー先のS3 Bucketの名前を定義してアップロード
      const copyBucket = 'sample-copy-bucket';
      const params = {
        Bucket: copyBucket,
        Key: key,
        Body: data.Body
      };
      s3.putObject(params, function(err, data) {
          if (err) {
            console.log(err, err.stack);
            context.done(err, err.stack);
          } else {
            console.log('data: ', data);
            context.succeed('complete!');
          }
      });
    }
  });
};

 今回利用するコードを簡単に解説します。Lambda関数実行時に受け取るeventパラメータの中に、S3 Bucketの情報やアップロードされたコンテンツの情報がJSONデータとして詰まっています。変数uploadBucketにS3 Bucketの名前を、変数keyにコンテンツのパスをセットし、Amazon S3のAPI(getObject)を使用して実際のコンテンツを取得しています。

 取得したコンテンツを、変数copyBucketで定義したS3 Bucketに書き込みます。コンテンツ書き込みの際にも、Amazon S3のAPI(putObject)を使用します。コンテンツをアップロードするS3 Bucketとコピー先のS3 Bucketを同じにしてしまうと、コンテンツのコピーが無限に実行されるので、必ずS3 Bucketは別々としてください。

 コード内のhandlerがLambda関数ハンドラとなります。ここではデフォルト(index.handler)のままとします。

 続いて、Lambda関数の実行時に利用するIAMロールを設定します。プルダウンから、先ほど作成したIAMロールを選択してください。

図7 Lambda関数ハンドラおよびロール

 詳細設定を開きメモリとタイムアウトをそれぞれ設定します。メモリはデフォルトの128MBで十分だと思います。タイムアウトはLambda関数の処理時間に余裕を持たせるため10秒とします。

図8 メモリとタイムアウトの設定

 「次へ」をクリックし、確認画面で「関数の作成」をクリックしたら、Lambda関数の作成が終了です。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。