LoginSignup
43
35

More than 5 years have passed since last update.

TypeScriptで始めるAWS Lambda開発

Last updated at Posted at 2016-11-06

はじめに

みなさんは型必要派でしょうか?不要派でしょうか?色々な意見があると思いますがぼくは必要派です。
Lambdaを作成するときにnodeを選択することが多いのですが、JavaScriptには静的型付けがなくてやりづらい思いをしています。

そこで、TypeScriptとServerlessを使ってLambdaを作成する方法を説明していきます。

リポジトリ

この記事の最終的なプロジェクトはGitHubにあります。
いいからコード見せろ派の方はこちらも合わせてどうぞ!

準備

Serverlessのインストール

$ npm install serverless -g

Serverlessのバージョンが表示されればOKです。

$ sls -v
1.1.0
  • 注:slsserverlessのショートカットです。

手順

Lambda Functionを作る

適当にlambda-with-typescriptなどと

$ sls create --t aws-nodejs --path lambda-with-typescript
  • my-service
    • event.json : テスト実行する際に使用するイベント(パラメタ)値のファイルです。
    • handler.js : 関数の本体です。※後ほど".ts"へ変更します。
    • serverless.yml : 設定ファイルです。

依存関連を追加

TypeScriptとwebpack関連のパッケージを追加します。

$ npm i --save-dev typescript webpack ts-loader serverless-webpack

node_modules内に

TypeScriptの設定

TypeScriptのコンパイラオプションを設定します。
とりあえず動かすだけなのでtscコマンドで生成するかtsconfig.jsonを作成してください。

tsc --init
/tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "sourceMap": false
    }
}

ハンドラを修正

コードをTypeScriptで書くためhandler.jsをhandler.tsにリネームします。
ハンドラのコードは適当なTypeScriptコードを書いておきます。

/handler.ts
export function hello(event, context, callback) {  
  callback(null, { 
    message: 'Hello from TypeScript!'
  });
};

Webpackを設定を追加する

TypeScriptをトランスパイルさせるためwebpack.config.jsを修正します。

/webpack.config.js
var path = require('path');

module.exports = {  
  entry: './handler.ts',
  target: 'node',
  module: {
    loaders: [
      { test: /\.ts(x?)$/, loader: 'ts-loader' }
    ]
  },
  resolve: {
    extensions: ['.ts', '.js', '']
  },
  output: {
    libraryTarget: 'commonjs',
    path: path.join(__dirname, '.webpack'),
    filename: 'handler.js'
  },
};

Serverlessのコンフィグを修正

serverless-webpackプラグインを使えるように末尾にpluginsを追加します。

/serverless.yml
~~~ 略 ~~~
plugins:
  - serverless-webpack

実行

ローカル実行

ターミナルで下記のコマンドを実行します。

$ sls webpack invoke -f hello -p event.json

先ほど作成したHello from TypeScript!が帰ってきていますね。

Serverless: Bundling with Webpack...
ts-loader: Using typescript@2.0.6 and /Users//Projects/lambda-with-typescript/tsconfig.json
Time: 785ms
     Asset     Size  Chunks             Chunk Names
handler.js  1.61 kB       0  [emitted]  main
Serverless: Run function hello...
{ message: 'Hello from TypeScript!' }

おわりに

TypeScriptでLambda関数を作成できましたがいかがだったでしょうか。
しかし、この例ではeventなどがanyなのでまだ型の恩恵を受けられていません。次回はこのあたりを改善したいと思います。

参考

43
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
35