(Google+)41この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。CodeにはIntelliSenseという強力なコードアシスタントの機能が備わっています。Lambdaファンクションを開発する環境を整えてみました。JavaScriptへのコンパイル〜Lambdaファンクションのデプロイまでをシングルコマンドで行える環境を整えます。Lambdaファンクションのデプロイについては、Lambdaファンクション本体と依存パッケージ一式をバンドルする方法として以下の2通りの方法をご紹介します。zipで固めてデプロイwebpackで1ファイルにバンドルしてデプロイLambdaファンクションのデプロイにはApexを使います。本ブログ記事の手順はApexに依存する部分もありますが、他デプロイツールにも適用可能な部分も多いかと思います。Apexは使わない、、という方も一旦読み進めていただければと思います。サンプルコードはAWSの公式ドキュメントの画像ファイルのサムネイルを作成するチュートリアルのコードをベースにしています。Code、Node.jsはインストール済みの前提で話を進めます。0.12.0Apexについては拙著のブログ記事も合わせて参照ください。ブログ記事は若干情報が古い部分がありますので、最新情報については公式ドキュメントを確認ください。initでプロジェクトの雛形を生成します。Logsのフル権限を持ったIAMロールが作成されます。AWSのクレデンシャル情報は環境変数に設定されたもの、または「~/.aws/credentials」のデフォルトプロファイルのものが使用されます。プロファイル名のようにプロファイル名を指定してコマンドを実行します。ts_example〜後略〜デフォルトでサンプルのLambdaファンクション(function/hello/index.js)が作成されます。これは不要なので削除しておきます。functions/helloこれでプロジェクトフォルダは以下の状態となります。「functions」フォルダの下に実際にLambdaファンクションを作成していく形になります。SDK、型定義ファイルをインストールします。Typescript向けの静的コード解析ツールであるTSLintも合わせてインストールしておきます。今回型定義ファイルはDefinitelyTypedにある以下の2つを利用しました。@types/node後者のNode.js用の型定義ファイルは必須ではありませんが、Lambdaファンクション内でprocessなどのNode.jsのオブジェクトを利用する場合はインストールが必要です。SDKのv2.7.0からSDK本体に付属するようになったので別途インストールは不要です。@types/nodeパッケージのバージョンは以下の通りです。「functions」フォルダの下に今回作成するLambdaファンクション用に「CreateThumbnail」フォルダを作成します。TypeScriptのソースファイル(*.tsファイル)を配置する「src」フォルダを作成します。GatewayのEventの型は定義されていますが、その他のEventについては型定義がありませんので自前で用意する必要があります。Eventの型定義ファイルを以下のように作成しました。string;}作成した型定義ファイルは「src」フォルダに配置します。ファイル名は「s3_event.d.ts」としました。Codeの設定TSLint用のエクステンションをインストールします。TSlintの設定プロジェクト全体でTSLintのルールを共有するためにプロジェクトルートに「tslint.json」を配置します。ルールの中身についてはよしなに設定ください。これで土台となる開発環境は整いました。tslint.jsonTypeScriptのコンパイル設定(tsconfig.json)プロジェクトルートに「tsconfig.json」を作成し、「src」フォルダ以下のtsファイルをコンパイルし「built」フォルダに出力するよう設定します(「built」フォルダはtsファイルのコンパイル時に自動的に作成されるので手動での作成は不要です)。「tsconfig.json」は複数のLambdaファンクションで共用するため、プロジェクトルートに配置しつつコンパイル時に各Lambdaファンクションフォルダにコピーして使う形にします。tslint.jsonコンパイルのtargetはes2015に設定しました。LambdaのNode.jsはv4.3.2であるためES2015対応は限定的です。Lambdaで確実に動作するコードを生成するためにはtargetをes5にする必要がありますが、この方法は後ほど紹介します。依存パッケージのインストール「functions/CreateThumbnail」に移動して画像ファイルのリサイズ処理に利用するパッケージgmとその型定義ファイルをインストールします。「gm」はLambdaファンクションのバンドルに含めるため、--save-devではなく--saveでインストールしておきます。バージョンは以下の通りです。「src」フォルダに「index.ts」ファイルを作成します。今回は以下のようなコードを書きました(せっかくなのでasync/awaitに入門してみました)。});}コード補完が効きます。Infoも表示されます。パラメータの誤りや過不足も検知できます。ここまででプロジェクトフォルダは以下の状態になります。「CreateThumbnail」フォルダの下にApexのLambdaファンクション設定ファイル「function.json」を作成し、「built/index.js」のhandler関数がエントリポイントとなるようhandlerの値を"built/index.handler"に設定します。「CreateThumbnail」フォルダの下に「.apexignore」を作成し「built」フォルダ以外をデプロイ対象から除外するよう設定します。「.apexignore」はApexでデプロイ対象外のファイルやフォルダを指定するためのファイルで、「.gitignore」と同様の書式が使えます。src/node_modules/package.jsontsconfig.json!built/node_modules/!built/package.jsonビルドフックの設定ApexではLambdaファンクションの「build(ビルド(zip化)前)」、「deploy(デプロイ前)」、「clean(デプロイ後)」の3つのタイミングで任意のシェルコマンドを実行することが可能です。今回は「build」のタイミングで以下の処理を実行します。「package.json」のdependenciesにあるパッケージのみを「built/node_modules」フォルダにインストールこれで「built」フォルダにはコンパイル済みのjsファイルと依存パッケージ一式が格納される形になります。buildフックは複数のLambdaファンクションで共用できるよう、「project.json」に設定します。cleanフックも設定し、デプロイ後に「built」フォルダを削除するようにします(これは必須ではありません)。}}これでようやくLambdaファンクションがデプロイできる状態になりました。プロジェクトフォルダ構成は以下のようになります。deployコマンドを実行するとTypeScriptのコンパイル〜依存パッケージのインストール〜Lambdaファンクション(zipファイル)のデプロイが実行されます。deployLabmdaファンクションのデプロイ設定2:Webpackで1ファイルにバンドルしてデプロイWebpackとts-loaderのインストールwebpackと、TypeScriptをコンパイルするためにts-loaderをインストールします。プロジェクトルートで以下を実行します。ts-loaderwebpackはv2.2.1を使います。}webpackの設定(webpack.config.js)プロジェクトルートに以下の内容で「webpack.config.js」を作成します(今回のサンプルコードでは「*.tsx」ファイルは登場しませんが、一応コンパイル対象に含めておきます)。}}今回のサンプルコードですが、webpackでのコンパイル時に以下のWARNINGが発生します。gmの依存パッケージですが、このcross-spawnのREADMEに以下の記述がありました。spawn-sync:このあたりでchild_process.spawnSyncが使えるかをチェックして、なければspawn-syncをrequireしているようです。Node.jsのランタイムはv4.3.2を利用するのでspawn-syncは不要です。Lambdaでは標準で使えるの同じくコンパイルの対象外としています)。「build」のタイミングでwebpackを実行するよう、「project.json」のbuildフックを以下のように設定します。}}プロジェクトフォルダ構成は以下のようになります。「webpack.config.js」を追加した以外は、「zipで固めてデプロイ」の場合と同一です。deployコマンドを実行するとwebpackでのコンパイル〜Lambdaファンクション(built/index.js)のデプロイが実行されます。実際のこのLambdaファンクションを動かす場合は、以下のドキュメントを参照しIAMロールのポリシー設定、LambdaファンクションへのS3イベントの追加を行なってください。今回のサンプルコードをコンパイルする場合、単純に「tsconfig.json」でtargetをes5にしただけでは以下のようなエラーが発生してコンパイルが通りません。これはサンプルコードで利用している「Promise」がES5に存在しないために発生するエラーです。here.これを回避するためにはTypeScriptのコンパイラーの「lib」オプションに「ES2015.Promise」を指定して、コンパイラーがPromiseの型定義を参照するようにします。具体的には「tsconfg.json」を以下のように設定します。]}targetをes5にし、libにes5とes2015.promiseを指定します。"scripthost"が参照されます)、libを一つでも指定した場合は暗黙の参照は行われないので、必要なライブラリーを明示的に指定する必要があります。Infoが参照できるのはやはり便利だと思いました。Infoが利用できます。これらの機能をお求めの方はとりあえず型定義ファイルだけでもインストールしておくことをお勧めします。async/awaitも初めて使ってみましたが、こちらも便利ですね。TypeScript、引き続き色々試していきたいと思います。529,392Rust始めました。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。和樹25こんにちは植木和樹@上越オフィスです。Terminalの機能確定版がリリースされたので試してみました。CAFEの他、NTTデータとセブンイレブンの取り組みや、サインポスト、Zippinなどの各社と流通・小売業との連携を業界マップに作成してみました。川原征大4形態素解析の入門中で、ブログの内容の分析を試しています。作業効率化をしたという話。夏目祐樹395こんにちは、CX事業本部の夏目です。MacのタッチバーのタッチIDが非常に便利なのですが、Terminalでsudoを叩かないと行けないときに使えたらなぁと思ったので、情報を共有します。臼田佳祐295ワークフロー自動化OSSのn8nをAWS環境で建てて検証してみました。非常に期待できるサービスです。Fargateの勉強をしています。使ってみたい方は参考にしてください。洋介255SnowflakeがAWSの東京リージョン上で稼働するようになりました。データを日本に置けます。芳賀健233こんにちは!猫様の忠実なるしもべ、芳賀健です。Tokyoで開催されました。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。