15

TLDR:来る応答に対する新しいキャッシュ動作を作成してCloudFront 307リダイレクトキャッシュを騙さなければならない私たちのラムダ関数から。CloudFrontで画像をサイズ変更し、同じURLで即座に取得する:AWS CloudFront - > S3 - > Lambda - > CloudFront

これを達成するためにどれくらい近いとは思わないでしょう。私たちは最後のステップでひどくぎこちなかった。

ビジネスケース:

当社のアプリケーションを格納しS3の画像と世界中の任意の地理的スローダウンを避けるために、CloudFrontのでそれらを提供しています。 今、私たちはデザインに本当に柔軟性があり、CouldFront URLに直接新しい画像の次元を要求できるようにしたいと考えています! 新しい画像サイズはそれぞれオンデマンドで作成されてS3に保存されるので、2度目の要求では がS3に存在し、CloudFrontにもキャッシュされるので、本当に迅速に処理されます。

ユーザーが画像chucknorris.jpgをアップロードしたとします。 のみ、元画像はS3に保存され、このように私たちのページで楽しめウィル:

//xxxxx.cloudfront.net/chucknorris.jpg

我々は今、サムネイルを表示する必要があることを計算しています200x200ピクセルです。 は、したがって、私たちは、テンプレートにあるように、画像srcを置く:

//xxxxx.cloudfront.net/chucknorris-200x200.jpg

この新しいサイズが要求された場合には、Amazon Webサービスは、それを提供する必要があります同じバケツと要求されたキーのフライ このようにして、画像はCloudFrontの同じURLに直接ロードされます。私はアーキテクチャの概要と、我々はAWSでこれをやっている方法についてのワークフローとの醜い描画作ら

:ここ

enter image description here

はPythonのラムダが終了する方法です:

return { 
    'statusCode': '301', 
    'headers': {'location': redirect_url}, 
    'body': '' 
} 

問題:

ラムダ関数をS3にリダイレクトすると、それはチャームのように機能します。 CloudFrontにリダイレクトすると、CloudFrontキャッシュ307(301,302および303と同様)がリダイレクトループに入ります。 はとすぐに私たちのラムダ関数は、CloudFrontのにリダイレクトするよう、CloudFrontのはAPIゲッタウェイURLの代わりに、S3から画像を取り込むを呼び出します。

enter image description here

私はCloudFrontをのBehaviors設定]タブで新しいキャッシュ動作を作成したいと思います。 この動作では、LambdaやS3からの応答をキャッシュしてはいけません(正確に内部的に何が起こっているのかわかりませんが)。 パスパターン-\d+x\d+\..+$を設定しようとしていますが、 "Lambda Function Association"を追加してLambda関数のARNを に追加し、イベントタイプをOrigin Responseに設定しています。 次に、 "Default TTL"を0に設定しています。

しかし、私は何らかのエラーにビヘイビアを保存することはできません。

enter image description here

は、我々は正しい道にある、またはこの「ラムダ関数協会」の考え方は全く違うのですか?

+0

:画像DIMENTIONは、CloudFrontのキャッシュヘッダーを提供しています。また、Cloudfrontの新しいLambda @ Edge機能を見てきましたか? –

答えて

7

最後に私はそれを解決できました。これは実際には構造的な解決策ではありませんが、必要なことを行います。

まず、マイケル氏のおかげで、すべてのメディアタイプに一致するようにパスパターンを使用しました。第2に、Cache Behaviorのページは私には少し誤解を招いていました。実際、ラムダ協会はLambda @ Edgeのためのものですが、私はキャッシュビヘイビアのすべてのツールチップでこれを見ていませんでした。この特定の問題のために、Lambda @ EdgeでAWSサービススコープを拡張したくないので、この機能は私たちを助けません。
私たちがサポートする複数のキャッシュ行動、メディアタイプごとに1つずつ定義されています:

enter image description here

私は0をするDefault TTLを設定し、各キャッシュの動作についてはここで

は、ソリューションのアプローチです。

そして、最も重要な部分:S3でそれらを置くとき、ラムダ関数の中で、私は、リサイズした画像にCache-Controlヘッダを追加しました:

s3_resource.Bucket(BUCKET).put_object(Key=new_key, 
             Body=edited_image_obj, 
             CacheControl='max-age=12312312', 
             ContentType=content_type) 

を、すべてが動作することを検証するには、私は新しいことを今見ますあなたはそのエラーメッセージについて、AWSのサポートに連絡してください

enter image description here

+0

サイズ変更イメージに 'Cache-Control'ヘッダを追加するのはなぜ重要ですか? 'Default TTL'を' 0'に設定すれば十分です。いいえ? –

+2

私の愚かな質問に答える。この「https://sketchboard.io/blog/serverless-image-resize-with-amazon-lambda」についての別のブログ記事を読んで、「最大年齢」が必要な理由を説明します。 CloudFrontは、オブジェクトをキャッシュする時間を決定するために(デフォルトの0を使用している最初の実行後に)使用されます。優れた質問と答え! @ katericata。 –

1

あなたは正しい軌道に乗っています...多分...しかし、少なくとも2つの問題があります。

ここで設定している "Lambda Function Association"はLambda @ Edgeと呼ばれ、まだ利用できません。アクセスできる唯一のユーザーは、限定プレビューに含まれるように申し込んだユーザーです。 "maximum allowed is 0"エラーは、あなたがプレビュー参加者ではないことを意味します。これがすべてのアカウントでいつ生放送されるのかに関する発表はありませんでした。

でも、それが利用可能になっても、私はOrigin ResponseトリガーがCloudFrontに別のものを試してもらうために何かをすることを許可しているとは思わないので、あなたが期待しているように、リダイレクトに従います。この主張と矛盾する文書がある場合は、私の注意を引くようにしてください。

ただし、Lambda @ Edgeは307にCache-Control: no-cacheを設定すると便利です。CloudFrontはキャッシュしませんが、リダイレクト自体はまだブラウザに戻ってくる必要があります。

また、Lambda @ EdgeはPythonではなくNodeのみをサポートしていますので、これはあなたの計画の一部ではないかもしれません。私はその質問から本当に分かりません。

Read about the [email protected] limited preview

第二の問題:

I am trying to set path pattern -\d+x\d+\..+$

あなたはそれを行うことはできません。パスパターンは、*ワイルドカードをサポートする文字列一致です。それらは正規表現ではありません。あなたはmultiple wildcards appear to be supported以来、/*-*x*.jpgで逃げるかもしれません。

+0

すべての説明をありがとうございます。あなたが提案したようにパスパターンを変更し、すべてのメディアファイルタイプに対して複数の動作を提供しました。 Lambda @ Edgeに関して、それはこれをこのように定義するためにAmazonの全く不公平です。そこにあるツールチップの情報ダイアログに「エッジ」という言葉は一切出ていません。私はLambda @ Edgeが私たちのニーズに合っているとは思っていませんし、現在はNodeしか持っていませんが、PILを使って作物/サイズ変更アルゴリズムがあるのでPythonを使いたいと思っています。 – katericata

+0

私はそれを「不公平」と呼んで何を意味するのか分かりません。 CloudFrontの背後にあるAPI Gatewayを使用して任意の言語でLambda関数を使用できますが、Lambda @ EdgeでCloudFrontの要求/応答動作を内部的に "フック"したり変更したりすることができます(これはNode.jsがサポートされている言語)は、[Lambda documentation](http://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html)と[CloudFront documentation](http:// docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)。 AWSはここでは欺瞞的ではありません。 –

+0

私はあなたが同意していますが、公式文書では、私の声明で意味していたのは、これがキャッシュ動作ページ(例外メッセージではない)に記載されていないということでした。そこには、Edgeという言葉はどこにも言及されていません。私はこれを少し誤解しています。今回のケースでは、Lambdaのみを使用しているため、Lambda @ EdgeはAWSファミリの新しいサービスであり、現在のところ私たちの範囲にはないので、これは驚くべきことでした。 :) – katericata

関連する問題