トリガーの有効化のチェックは入れません。
後程記述する関数の動作確認が終わってから手動で有効にします。
入力が終わったら次へをクリックします。
この画面で実際に関数を記述していきます。
関数名を記入する項目がありますがこの部分はお好きな名前で大丈夫です。
設計図の選択画面で「s3-get-object」を選択したので
S3からファイルを取得するためのコードが予め記述されています。
'use strict';
console.log('Loading function');
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
exports.handler = (event, context, callback) => {
//console.log('Received event:', JSON.stringify(event, null, 2));
// Get the object from the event and show its content type
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const params = {
Bucket: bucket,
Key: key,
};
s3.getObject(params, (err, data) => {
if (err) {
console.log(err);
const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
console.log(message);
callback(message);
} else {
console.log('CONTENT TYPE:', data.ContentType);
callback(null, data.ContentType);
}
});
};
しかし、このままだとS3からファイルを取得することはできますが
サムネイル画像を生成することが出来ません。
少しこのコードに追記します。
'use strict';
console.log('Loading function');
var fs = require('fs');
var im = require('imagemagick');
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
exports.handler = (event, context, callback) => {
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const params = {
Bucket: bucket,
Key: key,
};
s3.getObject(params, (err, data) => {
if (err) {
console.log(err);
const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
console.log(message);
callback(message);
} else {
var contentType = data.ContentType;
var extension = contentType.split('/').pop();
console.log(extension);
im.resize({
srcData: data.Body,
format: extension,
width: 100
}, function(err, stdout, stderr) {
if (err) {
context.done('resize failed', err);
} else {
var thumbnailKey = key.split('.')[0] + "-thumbnail." + extension;
s3.putObject({
Bucket: bucket,
Key: thumbnailKey,
Body: new Buffer(stdout, 'binary'),
ContentType: contentType
}, function(err, res) {
if (err) {
context.done('error putting object', err);
} else {
callback(null, "success putting object");
}
});
}
});
}
});
};
追記するとこんな感じになります。
S3からファイルを取得するまでは同じですが
取得した画像からimagemagickを利用してリサイズを行い
加工後の画像をサムネイル画像として再度S3にアップロードしています。
コードを記述したら、以下のようにIAM Roleの設定を行います
今回はこの部分は割愛してテンプレートから新しいRoleを自動で作成してしまいましょう。
ここで作ったロールに対してS3のオブジェクトを操作するポリシーがアタッチされる形になるので
正しく設定しないと関数がエラーになったりします。
(S3に対するアクセス権限がなくてAccess Deniedはよくあるお話です)
次へを押すと確認画面になりますので、「関数の作成」ボタンを押しましょう。
するとlambda関数が作成されます。
一覧に、先ほど作成した関数が表示されていますね!
③関数の動作テスト
作成した関数が正しく動作するかをテストします。
画面上部のアクションからテストイベントの設定を選択します。
すると、テストイベントの入力の画面になります。
テストイベントをjson形式で記述するのですが
このjsonをlambdaがS3から受け取って関数を実行するとお考えください。
今回は、test.jpgという画像ファイルを予めS3にバケットにアップロードしておき
その画像がアップロードされたことを想定してlambda関数が正常に動作するかをテストします。
このテストイベントにもテンプレートが用意されているので
S3 Putというテンプレートを利用しましょう。
以下を入力して、保存してテストをクリックします。
{
"Records": [
{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"sourceIPAddress": "*"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901",
"key": "test.jpg",
"size": 1024
},
"bucket": {
"arn": "arn:aws:s3:::lambda-img-resize",
"name": "lambda-img-resize",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "ap-northeast-1",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}
]
}
実行結果として成功したときのメッセージが返ってきました!
S3バケットの中身に変化があったか確認してみましょう。
はい、何事もなかったかのようにサムネイル画像が生成されています。
関数の実行自体は問題なさそうですね。
④lambdaトリガーの設定
いよいよ終盤、トリガーの設定を行います。
先程まではあくまでテストなので
今の段階で新しく画像をアップロードしてもサムネイル画像は作成されません。
画像がアップロードされたら関数が自動実行されるようにトリガーの設定を行う必要があります。
作成したlambda関数からトリガータブをクリックします。
関数を作成する段階でトリガー自体は作成しているので、あとはこれを有効化するだけです。
有効化をクリックします。
⑤動作確認
では、実際に画像をS3にアップロードして確認してみましょう。
・・・・・・・作成されてますね、素晴らしい。。。
■まとめ
いかがでしたでしょうか。
コードを書く必要があるので少し複雑になってしまいますが
EC2いらずでここまで出来てしまうので便利ですしおもしろいですね。
今回は軽く触ってみただけですが、もう少し高度なこともやってみようと思います。
以上です、ありがとうございました。
この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション
この記事をかいた人
About the author
2016年ビヨンド入社、現在6年目のインフラエンジニア
MSPの中の人として障害対応時のトラブルシューティングを行いながら
AWSなどのパブリッククラウドを用いたインフラの設計/構築も行っている。
最近はDockerやKubernetesなどのコンテナ基盤の構築や
運用自動化の一環としてTerraformやPackerなどのHashicorpツールを扱うことが多く
外部の勉強会やセミナーで登壇するEvangelistの役割も担っている。
・GitHub
https://github.com/nezumisannn
・登壇経歴
https://github.com/nezumisannn/my-profile
・発表資料(SpeakerDeck)
https://speakerdeck.com/nezumisannn
・所有資格
AWS Certified Solutions Architect - Associate
Google Cloud Professional Cloud Architect
お知らせ / イベント
Google Workspace導入・ 運用サポート提供開始
【オンライン開催】グローバルeSIMとモバイル技術