たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 12770
目次
本題
Lambda でリサイズからの S3 + CloudFront で配信
作戦
構成図
つくる
Lambda で動く UltraHDR 付き ImageMagick をビルドする
Lambda で ImageMagick を動かすためには
ライブラリ同梱の詳細
ビルド準備
Amazon Linux 2023 を用意する
必要なパッケージを入れる
libjpeg
zlib
libpng
libwebp
libultrahdr
ImageMagick
ImageMagick
ビルドした ImageMagick を起動してみる
zip に固める
Lambda Layer として登録
S3 バケットを作る
受け付け用バケットに画像をいれる
Lambda S3 のアクセス権限のためのポリシーとロール作成
Lambda Node.js で動かす JavaScript を書く
環境構築
TypeScript
ContentType
zip にする
画像が UltraHDR かどうかの判定
Lambda を作る
Lambda 環境変数追加
LambdaLayer を追加
メモリ上限とタイムアウトを緩和する
テスト
テストうごいた!
受け付け用バケットに画像が入ったら Lambda が起動するように
受け付け用バケットに入れてもうごく!
受け付け用バケットは勝手に削除されるように
完成
おまけ CloudFront で公開する手順
おわりに
おわりに2
おわりに3
どうもこんにちは、飲み会した。
今回の記事で作ったAmazon S3+Lambda+CloudFront製画像変換&配信システムのお陰で、ちゃんとUltraHDRの画像が貼れているはず。
飯もあります。
飯テロするか~~~w
そういえば言われた。
わたし、更に痩せたらしい。のでいっぱい食べてきた。
UltraHDRをブログに貼りたい。が、世の中のサービスはUltraHDR無視されてJPEGになってしまうので、UltraHDRのまま配信出来る何かを探す必要があった。
あと、ブログ用に画像をGIMPで小さくしてるけど手間だし自動でやってほしいし、そもそもUltraHDRは無理だからそれもなんとかしたい。
これだ。よくあるAWSサーバーレス入門みたいなやつ。S3バケットにブログに貼りたい画像をアップロードすると、Lambdaが起動して、ImageMagickを使って半分くらいのサイズにしたあと、
リサイズ保存用S3バケットに放り込まれるようにし、このバケットをCloudFrontで配信する。完璧じゃん。
S3に画像を放り込んだらAWS Lambdaが起動して、ImageMagickで変換する。
できる限りそのままの画像をアップする/originalと、ブログに乗せる用に小さくした/resizeへそれぞれ画像を配置する。
変換過程ですが、画像をアップロードするとUUIDが払い出され、できる限りそのままの画像と、配信用に半分くらいにした画像が保存されます。
おなじUUIDになる。
CloudFrontの部分はAWS S3+CloudFrontで静的サイトの記事で触ったので、あんまり触れません、、
今回の記事はAWS Lambdaで画像をリサイズしたいので。
AWS Lambdaで動くUltraHDR付きImageMagickを作る(一番大変)S3の受け付け用、配信用バケットを作るLambdaで動かすためのコードを書くS3をトリガーに起動するようにするCloudFrontで配信する画像を小さくするためのImageMagickをLambdaで動くようにビルドします
いまNode.jsで画像のリサイズをしたいならsharpってのが良いらしいんですが、UltraHDRに対応していないので今回はImageMagickにします。
ImageMagickのビルドだけならそんなに難しくない。
Ubuntu で UltraHDR に対応した ImageMagick を作る - たくさんの自由帳
https://takusan.negitoro.dev/posts/imagemagick_build_add_ultra_hdr/
ただ、それはお使いのマシンに既にインストールされている(もしくはインストールした)libjpeg-devやlib-pngに依存しているからで、
パッケージを新たに入れることが出来ない(yum install 出来ない)AWS Lambdaでは、少し考える必要があります。
LambdaにはLambda Layerと呼ばれる機能があり、Lambdaが動くマシンに依存関係を配置させる事ができます。
この機能を使い、必要なバイナリをすべて同梱して、Lambda Layer機能を使い、LambdaのマシンにImageMagickのバイナリや必要なライブラリを配置させます。
と、いうわけで、今回はLambdaで動くImageMagick (ライブラリ同梱済み)を作ろうと思います。
先述の通りAWS Lambda環境下では、apt install等でインストールする事がが出来ないため、libjpeg-dev相当のライブラリもImageMagickと一緒に同梱する必要がある。そのせいでビルドが結構面倒なことになってる。
今回は必要なライブラリをすべて/optにインストールすることにします。(/opt/binや/opt/libみたいになる)
なぜかと言うと、これで/optをすべてzipに固めてLambda Layerに登録すれば、パスが通った状態になるんですよね。
(Lambda Layerは/binにパスが通った状態になるそう)。
Amazon Linux 2023。WSLで起動する方法があるそうなのでこれでいきます。
Developing on Amazon Linux 2 using Windows | Amazon Web Services
See how to get the best of both Windows and Linux as your development environment all on the same machine. Run the Amazon Linux 2 distribution via the Windows Subsystem for Linux 2 and leverage the Visual Studio Code Remote – WSL extension, AWS Toolkit for Visual Studio Code, and the AWS SAM CLI to provide a frictionless development experience.
https://aws.amazon.com/blogs/developer/developing-on-amazon-linux-2-using-windows/
GitHub - rlove/AmazonLinux-2023-WSL: Amazon Linux 2023 as a WSL Instance. Supports multiple install.
Amazon Linux 2023 as a WSL Instance. Supports multiple install. - rlove/AmazonLinux-2023-WSL
https://github.com/rlove/AmazonLinux-2023-WSL
が、公式のものじゃないらしいので、どうしても気になる人はEC2借りるなりLightsailでAmazon Linux 2023のマシンを用意しても良いかもしれません。
スペックは多少高いものを選ばないとダメそう(Lightsailの一番下を選んだら固まってしまった...)
これでビルドします。
なぜかと言うと、AWS Lambdaを実行するためのマシンが使っている、Linux ディストリビューションがAmazon Linux 2023だそうで、OS同じでビルドすれば多分動くでしょって。
というかUbuntuでビルドしたら何回やってもダメだったから、Lambdaの環境と同じディストリビューションにしてみた、
標準Cライブラリとやらのバージョンが一致してないとかなんとかで。
Error: Command failed: /opt/bin/magick --version",
/opt/bin/magick: /lib64/libc.so.6: version `GLIBC_2.38' not found (required by /opt/lib/libMagickCore-7.Q16HDRI.so.10)
/opt/bin/magick: /lib64/libm.so.6: version `GLIBC_2.38' not found (required by /opt/lib/libMagickCore-7.Q16HDRI.so.10)
/opt/bin/magick: /lib64/libm.so.6: version `GLIBC_2.35' not found (required by /opt/lib/libMagickCore-7.Q16HDRI.so.10)
/opt/bin/magick: /lib64/libm.so.6: version `GLIBC_2.38' not found (required by /opt/lib/libMagickWand-7.Q16HDRI.so.10)
/opt/bin/magick: /lib64/libc.so.6: version `GLIBC_2.38' not found (required by /opt/lib/libMagickWand-7.Q16HDRI.so.10)update + upgradeのコンボ、あとaptのbuild-essentialに当たるDevelopment Toolsを入れます。wgetも入ってなかった...
yum update
yum upgrade
yum groupinstall "Development tools"
yum install wgetここからダウンロードリンクが探せるので、wgetか何かで落として解凍。gzの方です。
cd ~
wget https://www.ijg.org/files/jpegsrc.v9f.tar.gz
tar xvzf jpegsrc.v9f.tar.gz
cd jpeg-9fprefixオプションで/optにインストールするように設定して、makeしてinstall。
ライブラリ創作先に/optを追加します。
./configure --prefix=/opt CPPFLAGS=-I/opt/include LDFLAGS=-L/opt/lib --disable-dependency-tracking --enable-shared
make
make installmake installすると/optにバイナリが配置されているはずです。
見てみましょう。
ls /opt入ってますね!
libpngがこれを使っているらしいのでこれもビルドします。
同様にホームページからダウンロードリンクを探してwgetで落とします。gzの方です。
cd ~
wget https://www.zlib.net/zlib-1.3.1.tar.gz
tar xvzf zlib-1.3.1.tar.gz
cd zlib-1.3.1
./configure --prefix=/opt
make
make install同様にlibpngもダウンロードリンクを探してwgetで落とします。gzの方で。
cd ~
wget http://prdownloads.sourceforge.net/libpng/libpng-1.6.47.tar.gz
tar xvzf libpng-1.6.47.tar.gz
cd libpng-1.6.47
./configure --prefix=/opt CPPFLAGS=-I/opt/include LDFLAGS=-L/opt/lib --disable-dependency-tracking --enable-shared
make
make installwebpの画像を扱う予定があれば。この通りに進めます。libgifが無くてもビルドは出来た...、GIFが扱えないだけでwebpは使えるのかな
cd ~
wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.5.0.tar.gz
tar xvzf libwebp-1.5.0.tar.gz
cd libwebp-1.5.0
./configure --prefix=/opt CPPFLAGS=-I/opt/include LDFLAGS=-L/opt/lib --disable-dependency-tracking --enable-shared
make
make installUltraHDRのビルドです。
これはCMakeなので他とは若干違う。また、libjpegが必要なので、予めビルドして/optにインストールしておいてください。
ビルド手順がDebian系列になっているのでCentOS系列用?に読み替える必要があります。
あといくつかオプションを指定してLambda Layerに入れられるようにします。
まずはビルドに必要なツールを
yum install cmake pkg-config ninja-build次にソースコードを落として、ビルド用のフォルダを作ります。
cd ~
git clone https://github.com/google/libultrahdr.git
cd libultrahdr
mkdir build_directory
cd build_directoryそしたらビルドします。
オプションですが、
gcc、g++をコンパイラに指定
yum groupinstall "Development Tools"で付いてくるはず/opt/libに
libjpegが/opt/libにあるので、それを使うlibに配置
Debian系は/libに配置してくれるが、CentOS系列?はlib64に配置しようとするLambda Layerはlibにしかパスが通ってないのでlibに合わせる/opt--prefix=/optみたいな../はpwdがbuild_directoryで、親にあるものを探すためcmake -G Ninja -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_PREFIX_PATH=/opt/lib -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_INSTALL_PREFIX=/opt ../
ninja
ninja install7.1.1-47は最新リリースに合わせてください→ Releases · ImageMagick/ImageMagick
ImageMagick is a free, open-source software suite for creating, editing, converting, and displaying images. It supports 200+ formats and offers powerful command-line tools and APIs for automation, ...
https://github.com/ImageMagick/ImageMagick/releases
cd ~
git clone --depth 1 --branch 7.1.1-47 https://github.com/ImageMagick/ImageMagick.git ImageMagick-7.1.1
cd ImageMagick-7.1.1そうしたら、デリゲートライブラリの捜索先に/opt/libを指定します。これでさっきビルドしたlibjpegたちを発見できるはずです。export ...の1行ですね。
configureは先駆者のママです。何も分からず。。これでAWS Lambdaで動く。UltraHDRはデフォルト無効なのでyesを付けます。
export PKG_CONFIG_PATH=/opt/lib/pkgconfig
./configure CPPFLAGS=-I/opt/include LDFLAGS=-L/opt/lib --prefix=/opt --disable-docs --without-modules --enable-delegate-build --without-magick-plus-plus --without-perl --without-x --without-dmr --without-heic --without-jbig --without-lcms --without-openjp2 --without-lqr --without-lzma --without-pango --without-raw --with-rsvg --without-tiff --disable-openmp --disable-dependency-tracking --with-uhdr=yesjpegやpng、uhdrがyesになっているはず。
そしたらmakeしてmake installです。
make
make install7.1.1-47は最新リリースに合わせてください→ Releases · ImageMagick/ImageMagick
ImageMagick is a free, open-source software suite for creating, editing, converting, and displaying images. It supports 200+ formats and offers powerful command-line tools and APIs for automation, ...
https://github.com/ImageMagick/ImageMagick/releases
cd ~
git clone --depth 1 --branch 7.1.1-47 https://github.com/ImageMagick/ImageMagick.git ImageMagick-7.1.1
cd ImageMagick-7.1.1そうしたら、デリゲートライブラリの捜索先に/opt/libを指定します。これでさっきビルドしたlibjpegたちを発見できるはずです。export ...の1行ですね。
configureは先駆者のママです。何も分からず。。UltraHDRはデフォルト無効なのでyesを付けます。
export PKG_CONFIG_PATH=/opt/lib/pkgconfig
./configure CPPFLAGS=-I/opt/include LDFLAGS=-L/opt/lib --prefix=/opt --disable-docs --without-modules --enable-delegate-build --without-magick-plus-plus --without-perl --without-x --without-dmr --without-heic --without-jbig --without-lcms --without-openjp2 --without-lqr --without-lzma --without-pango --without-raw --with-rsvg --without-tiff --disable-openmp --disable-dependency-tracking --with-uhdr=yesjpegやpng、uhdrがyesになっているはず。
そしたらmakeしてmake installです。
make
make installversion返ってくるか確認です!
ちゃんとDelegatesの欄にjpegやpngやuhdrがあります!
/opt/bin/magick --version結果。
Version: ImageMagick 7.1.1-47 Q16-HDRI x86_64 c8f4e8cb7:20250329 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI
Delegates (built-in): jng jpeg png uhdr webp zlib zstd
Compiler: gcc (11.3)問題なく動作したらLambda Layerを作りましょ。
これで/optにインストールしたlibjpegやImageMagickやlibcがzipに。WindowsのエクスプローラーからWSL2のドライブ見れるので拾ってください。
cd /opt
zip -r ~/imagemagick-layer.zip .Lambda→レイヤー→レイヤーの作成へ進み、適当な名前をつけます。
さっき作ったzipを放り込んで、アーキテクチャはx86_64、ランタイムはNode.jsで!
これでImageMagickをAWS Lambdaから呼び出す準備はおっけーです。
チュートリアルのそれと同じ
バケットを作ります。画像を受け付けるバケットと、リサイズした画像を置いておくバケットです。
事故が起きるくらいなら入力、出力で2つ作ったほうが良いです。
UltraHDRのImageMagickをビルドしたので、UltraHDRの画像で
IAMのポリシーページを開いて、以下のJSONを貼り付ける。CloudWatchは使わないので消しました、、(いいのか?)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::*/*"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::*/*"
}
]
}そしたら次に進んで、よしなに名前をつけてください。
ポリシーが出来たら、ロールを作ります。Lambdaを先に作成すると対応するロールが作成されているかもしれない、、
IAMのロールページを開いて、ロールを作成を押します。AWS のサービスを選び、その下はLambdaにします。
そしたら次に進み、先程作成したポリシーを付けてあげて、次へ進みます。名前間違えてエラーになったのでリロードするなりして合ってるか確認してね。
名前はよしなにつけてください。
今回はJavaScript (Node.js)にします、Javaも出来るそう、、ですが郷に従え(チュートリアル)というわけで。
別にこの規模ならJavaScriptで良いし。ローカルで適当にnpm initします。
npm initつぎに、必要なライブラリをば。
今回はTypeScriptをJavaScriptにしてzipに詰めてアップロードする気でいます。
aws-lambdaの型定義と、esbuildを入れます。esbuildでtsをjsにしてLambdaで動かします。Node.jsで.tsはまだ厳しそう雰囲気(もう少しな気はする)
あとs3クライアント
npm install -D @types/aws-lambda esbuild
npm i @aws-sdk/client-s3次に.jsにするためのコマンドを書きます。package.jsonを開いて、"scripts": { }の部分をこうします。Windowsでしか動かないと思います。多分delをrmに、powershell Compress-Archive ...をzipコマンドに置き換えればLinuxでも動くはず?
"scripts": {
"prebuild": "del /q dist",
"build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js",
"postbuild": "cd dist && powershell Compress-Archive -Force -Path index.js* -DestinationPath ../dist.zip"
},全部張ります。ドーン。UltraHDRに対応させたので複雑です、、、あとバケット名はLambda環境変数から取り出すようにしました。
import child_process from 'child_process'
import { promisify } from 'util'
import fs from 'fs/promises'
import { randomUUID } from 'crypto'
import path from 'path'
import { S3Event } from 'aws-lambda'
import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'
// "GainMap"の文字をバイト配列
const GAINMAP_TEXT_BYTE = Buffer.from('GainMap', 'utf8')
// exec() を Promise に
const exec = promisify(child_process.exec)
// S3 クライアント
const s3 = new S3Client({ region: 'ap-northeast-1' })
// 変換した画像の保存先 S3 バケット名(Lambda 環境変数)
const RESULT_S3_BACKET_NAME = process.env['S3_RESULT_BACKET_NAME']
export const handler = async (event: S3Event) => {
const bucket = event.Records[0].s3.bucket.name
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '))
// 拡張子を取得
const imageExtension = key.match(/\.([^.]*)$/)?.[0].toLowerCase()
if (!imageExtension) {
console.log('拡張子が不明です。')
return
}
try {
// S3 から追加された画像を取り出す
const response = await s3.send(new GetObjectCommand({
Bucket: bucket,
Key: key
}))
const inputImageByteArray = await response.Body?.transformToByteArray()
if (!inputImageByteArray) {
console.log('S3 からデータが取得できませんでした')
return
}
// 作業用フォルダをつくる
// Lambda はインスタンス再利用されるかもなのでできればランダム
const tempDirectory = await fs.mkdtemp('/tmp/image')
// ImageMagick に渡すため /tmp に保存
const inputFilePath = path.join(tempDirectory, `input${imageExtension}`)
await fs.writeFile(inputFilePath, inputImageByteArray)
// 変換した画像データの保存先
// できる限りそのままの画像と、リサイズで2つ
const originalImagePath = path.join(tempDirectory, `original${imageExtension}`)
const resizeImagePath = path.join(tempDirectory, `resize${imageExtension}`)
// ImageMagick でリサイズ
// ついでに Exif に回転情報があれば画像自体を回転させて、Exif も消す(スマホの名前とか入ってる)
if (Buffer.from(inputImageByteArray.buffer).includes(GAINMAP_TEXT_BYTE)) {
// UltraHDR 画像の場合は uhdr: を付ける必要があるので
await Promise.all([
await exec(`magick -define uhdr:output-color-transfer=hlg -define uhdr:hdr-color-transfer=hlg uhdr:${inputFilePath} -auto-orient -strip uhdr:${originalImagePath}`),
await exec(`magick -define uhdr:output-color-transfer=hlg -define uhdr:hdr-color-transfer=hlg uhdr:${inputFilePath} -auto-orient -strip -resize 50% uhdr:${resizeImagePath}`)
])
} else {
// UltraHDR じゃない
await Promise.all([
await exec(`magick ${inputFilePath} -auto-orient -strip ${originalImagePath}`),
await exec(`magick ${inputFilePath} -auto-orient -strip -resize 50% ${resizeImagePath}`)
])
}
// 画像を取得
const [originalByteArray, resizeByteArray] = await Promise.all(
[originalImagePath, resizeImagePath]
.map((imagePath) => fs.readFile(imagePath))
)
// Content-Type も付与する
let contentType: string
switch (imageExtension) {
case ".jpg":
case ".jpeg":
contentType = 'image/jpeg'
break
case ".png":
contentType = 'image/png'
break
default:
// 知らない拡張子の場合は image/ をくっつけて返す
contentType = `image/${imageExtension.replace('.', '')}`
break
}
// 2つの画像で同じ UUID になるように
// パスは /original と /resize
const fileName = `${randomUUID()}${imageExtension}`
const originalPut = new PutObjectCommand({
Bucket: RESULT_S3_BACKET_NAME,
Key: `original/${fileName}`,
Body: originalByteArray,
ContentType: contentType
})
const resizePut = new PutObjectCommand({
Bucket: RESULT_S3_BACKET_NAME,
Key: `resize/${fileName}`,
Body: resizeByteArray,
ContentType: contentType
})
// 出力先 S3 にアップロード
await Promise.all([s3.send(originalPut), s3.send(resizePut)])
} catch (error) {
console.log(error)
}
}を指定しないと、ブラウザで画像URLを開いたときに、画像ではなくダウンロード画面が表示されます。
詳しくは
index.jsとindex.js.mapを一つのzipにしてくれるコマンドをscriptsで定義したので、これを叩けばdist.zipが出来上がるはずです。
npm run buildそのままImageMagickに入れるとjpegで処理されるため、gainmapが消えちゃう、(uhdr:指定が必要)。UltraHDRを配信するためにS3+CloudFrontにしているのに、、、
というわけで、exec()の段階でUltraHDR画像かを判定する必要がある。
バイナリエディタを眺めてた結果、GainMapってバイト配列の文字列が入っていたので、このバイト配列があるかで判定すれば良いはず。
あんまり自信ないけど自分しか使わないし!
それがこれです。
const GAINMAP_TEXT_BYTE = Buffer.from('GainMap', 'utf8')
const imageByteArray = await fs.readFile('nomikai.jpg') // 画像パス
const hasGainMap = imageByteArray.includes(GAINMAP_TEXT_BYTE) // GainMap があれば UltraHDRLambdaの作成ページを開いて、適当な名前をつけ、x86_64を選び、ロールはさっき作ったものを選びます。
あとは関数を作成を押せばいいです、
できたらアップロード先を押して.zipをアップロードします。
保存先バケットの名前を環境変数から取り出すようにします。
ここのENVIRONMENT VARIABLESの+から以下の名前でバケット名を入れてください。
ここのLayerを押すとスクロールするので、レイヤーの追加からさっきアップロードしたLambdaLayerを選択する。
ImageMagickをLambdaのデフォルトスペックで動かすと厳しいっぽい?
Error: Task timed out after 3.00 secondsというわけでメモリ割り当てとタイムアウトを増やします、設定を開きます。
10秒くらいで終わらせるためには2GB (2048MB)欲しいですね。。
よく見ると10GBまで使えるらしいですが、私のAWSアカウントだと3GBまでしか使えませんでした!w。
サポートに言えば解禁してくれるらしいです。
テストを選ぶ。
よしなに名前をつけて、JSONは以下を貼り付けてください。が、一部直して貰う必要があります!!
{
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "ap-northeast-1",
"eventTime": "1970-01-01T00:00:00.000Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"responseElements": {
"x-amz-request-id": "EXAMPLE123456789",
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "testConfigRule",
"bucket": {
"name": "受け付け用バケットの名前",
"ownerIdentity": {
"principalId": "EXAMPLE"
},
"arn": "受け付け用バケットの arn"
},
"object": {
"key": "受け付け用バケットにアップロードした画像のkey (名前)",
"size": 1024,
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901"
}
}
}
]
}できたら保存からのテストで。スペックを上げたので10秒くらいで終わるはず。
保存先バケットを開いてみてください。original/とresize/にちゃんと入っているはず!
Lambdaのトリガーを追加を押します。
そしたらS3を選んで
バケットは受け付け用バケットに、すべてのオブジェクト作成イベントになってることを確認して、
一番下にあるチェックマークにチェックを入れて、追加。
S3の画面にJPEGをどーーん
LambdaのモニタリングのInvocationsを見ると呼び出されてるのが分かるはず。
ライフサイクル機能があります。今回は受け付け用バケットで、特に保護とかは興味がないので、バージョニングは無効です。
無効にしている場合、上記の URL を見る限りライフサイクルがトリガーされ期限切れになったら、削除になるらしい(バージョニング無効なので)
というわけで追加します。受け付け用バケットでやること。
作成を押します。
バケット内のすべてのオブジェクトに適用にして、オブジェクトの現行バージョンを有効期限切れにするにチェックを入れます。
日数はお好みで、まあ1日でも長いんですが
ここもよく見ると、バージョニング無効の場合は有効期限切れが削除になるって。
これでオブジェクトをアップロードしてみると、削除日時が表示されます。
あとは保存先バケットをCloudFrontで公開するなりすれば画像を配信する超簡易的サーバーの完成。S3+CloudFrontは前に記事にしたのでそれで!!!
S3 + CloudFrontで静的サイトの記事で。CloudFront Functionsは不要です。
CloudFront と S3 で静的サイトホスティングをする - たくさんの自由帳
https://takusan.negitoro.dev/posts/aws_sitatic_site_hosting/
CloudFrontのディストリビューションを作る
S3バケットS3は公開しないのでOACを選ぶS3のバケットポリシーに貼り付ける
S3の画像のキー をくっつけた URL でアクセス、画像が返ってくること。
S3にある画像を選んでキーをコピーするCustom SSL certificate - optionalのRequest certificateを押す
CloudFrontにアクセスできるようにするため、再度DNS レコードを追加する
DNSでの確認が終わって、AWSのSSL 証明書が使えるようになったら、CloudFront ディストリビューションの管理画面を開き、Custom SSL certificate - optionalではさっき作った証明書を、Alternative domain name (CNAMEs) - optionalで使いたいドメインを入れます。
AWS Lambdaで使ったソースコードです、npm iからのnpm run buildでzipが出来るので、説明通りデプロイして環境変数をセットすれば良いはず。
ちなみに、自分ひとりしか使わないのでバリデーションとか一切していません。
不特定多数に使わせる場合はちゃんと整備したほうが良いと思います。
S3のコンソールにアクセスしないと画像わからんし、アップロードのためにコンソールログインするのもあれなので、次回はそれを解決します。
超簡易的画像配信サーバーのクライアント編。