AWS lambda zipファイルアップロード

AWSlambda zipアップロード

AWS lambdaはサーバーレスで関数処理を実行したい場合便利なサービスです。初めて試す場合シンプルにブラウザからコードを記述しテスト実行まで行えます。lambda関数をNode.js 12.xの設定で作成した場合初期のコードは下記のサンプル(index.js)が入っています。

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

index.jsに入る範囲でコードを書く分には、ブラウザの機能を使って書いてもいいとは思うのですが、複数のJSファイルで構成したい場合やnode_modulesを埋め込みたい場合ブラウザから手動で登録していくのは大変な作業です。このような場合lambdaには.zipファイルでのアップロードとS3からのファイルアップロードが利用できます。私の場合ローカル環境でテストしてzipファイルにまとめてlambdaへアップロードする方法を採用しています。ローカル環境でプログラムに必要なnode_modulesを先に入れてしまいます。そして、メイン実行するJSファイルをサンプルと同じくindex.jsという名前にしてexports.handlerに返す処理を埋め込みます。自分で作成したクラスモジュールなども別のJSファイルに入れます。その後下記コマンドでzipを実行します。

#プロジェクト内のディレクトリの場合
zip -r index.zip ./*

zipコマンドは-rオプションをつけるだけです。index.zipが完成したらブラウザ画面の[関数コード]のアクション内「.zip ファイルをアップロード」を選択します。

「.zip ファイルをアップロード」を選択
「.zip ファイルをアップロード」を選択

ファイルアップロードダイアログが表示されるのでアップロードさせるzipファイルを選択し[保存]ボタンを押します。アップロードが成功するとブラウザの関数コード編集が出来なくなるようです。

.zip ファイルをアップロードダイアログ
.zip ファイルをアップロードダイアログ

firstIndexのIndex?to Int変換

utf16Offset

Swiftの文字列検索で使うfirstIndex()やlastIndex()はelement引数にCharacterすることでIndex?が返ります。この場合Int型ではなくIndexなので確認すると下のようなデータです。

Index(_rawBits: 65793)
Index(_rawBits: 65793)

Index型なので操作には問題ありませんが、Intに変換したい場合があります。この場合encodedOffsetを使うというサイトを見かけますが下記のようなメッセージがでます。

encodedOffset has been deprecated as most common usage is incorrect. Use utf16Offset(in:) to achieve the same behavior.
encodedOffsetは非推奨
encodedOffsetは非推奨

encodedOffsetは非推奨になったようでutf16Offset<S>(in s: S) -> Intをつかったほうがいいようです。たとえば下記のような”#”などをハッシュタグとして判断したい場合、何文字目に”#”が入っているのか確認できます。

let seven:String = "ウルトラ#セブン"
let i:Int = seven.firstIndex(of: "#")!.utf16Offset(in: seven)
print (i)

このコード内変数iには4が入ります。

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED