AWS Lambda Python で外部ライブラリを使う

ライブラリインストール

pip install xxx -t ./

-t でライブラリのインストール場所を指定。

ライブラリを含めLambdaにアップロードするのに圧縮する。

$ zip -r app.zip *

一度ライブラリをアップすれば、AWSのコンソールから必要なコードのみ編集してもOK。

参考

https://qiita.com/Hironsan/items/0eb5578f3321c72637b4

Spring Boot の認証にcookieを使う

Spring Boot でWebアプリを開発していて、少し規模が大きくなり複数のAppサーバーを使用するときにいくつか課題がある。
その一つとしてセッションの問題がある。

Spring Bootではデフォルトでセッションをサーバー側に保存するため、複数のサーバーを使用する場合、クライアントが異なるサーバーにアクセスするとセッションを維持できない。
そこで複数のサーバーで共有するなど、解決方法はいくつか考えられる。

  1. セッション情報をDBだったりRedisのようなKVSに保存する
  2. WebサーバーStickysessionを使う

「1.」 は良い方法ですが、セッション情報を保存するサーバーの運用、性能、冗長性など余計な管理が増えてしまう。
「2.」 は容易に実現できるが、同一のAppサーバーにアクセスする必要があるので、増減を動的に行うのが難しい。

そこでセッション情報をcookieのようなクライント側に保存する方法が良いのではと思う。
例えばPlay frameworkではセッションの実態はcookieを使用している。
https://www.playframework.com/documentation/2.6.x/SettingsSession#Configuring-the-session-cookie

これをSpring Bootで実現するときに参考にしたサイトをメモ。
http://www.svlada.com/jwt-token-authentication-with-spring-boot/
https://qiita.com/nyasba/items/f9b1b6be5540743f8bac

IFTTTをさわってみる

まずはサインアップ。Google、Facebookアカウントで認証できるようです。

Applet 作成

ログイン後、My AppletsからNew Applet。

トリガー作成

“+this”を選択。一瞬分かりづらいけど面白いUIです。

Webhooksを検索。

Connect

Event Nameを入力。

通知先設定

“+that”を選択。

Notifications を検索。
専用のスマホアプリをインストールすれば、スマホに通知がされるようです。

ひとまずテキストだけ送信できれば良いので、Send a notification from the IFTTT app を選択。

イベント名と、受信したデータを表示する。

{{OccurredAt}} [{{EventName}}] Value1= {{Value1}}, Value2= {{Value2}}, Value3= {{Value3}}

Finish

スマホアプリのインストール

AppStoreからアプリをインストールしてログインする。

テスト送信

My AppletsからWebhooksのアイコンをクリック。

Documentation

イベント名とデータを入力して、Test It

S3 + CloudFront でサイト構築

サーバー側の処理が不要なら、EC2でサーバーを立てずにS3 + CloudFrontでサイトを構築する。

S3 設定

バケットを作成。

バケット名、リージョンを選択して作成。

作成したバケットの、
アクセス権限 > バケットポリシー > バケットポリシーエディター
に下記を入力して保存。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{バケット名}/*"
        }
    ]
}

確認用にhtmlファイルでもバケットにアップロードしておく。

CloudFront 設定

Distributionを作成。Webを選択。

Origin Domain Name でS3に作成したバケットを選択。

Default Root Object にアップロードしたhtmlファイルを指定。

作成までに数分かかります。

S3上でファイルを更新してもキャッシュのおかげで、すぐに変更が反映されません。
キャッシュを削除するには対象DistributionのInvalidatinsから削除したいキャッシュのPathを指定して作成。

存在しないパスにアクセスするとAccessDeniedとなるので、ErrorPageを設定する。

403のときに404(Not found)として、適当なファイルにアクセスさせる。

この変更にも時間がかかるので注意。

Vue.js + TypeScript で外部ライブラリを使用したいが型定義がない

型定義があるライブラリはここを参照。

ただ、そもそもない時の回避方法を考える。

  • 無視する
    該当の処理の前に、
    // @ts-ignore:

  • 型定義を作る
    ただしく定義するのは大変なので、
    declare module “{パッケージ名}” を記載した .d.ts を作成

  • declare
    declare var xxx: any;
    でany型として宣言してしまう。