Amazon S3
目的
イベント通知機能とLambda関数を介してGlasswall Halo APIを使用し、Amazon S3バケット内で自動ファイルサニタイズを設定します。
Amazon S3 インテグレーションガイド
- 前提条件
- ステップ 1 - S3 バケットを作成する
- ステップ 2 - SQS キューを作成する
- ステップ 3 - イベント通知を有効にする
- ステップ 4 - Lambda 関数を作成する
- ステップ 5 - 実行ロールを設定する
- ステップ 6 - Lambda コードをアップロードする
- ステップ 7 - トリガーを追加する
- ステップ 8 - テスト
前提条件
-
次の許可 policy を持つ AWS account および IAM (Identity and Access Management) role:
- Amazons3fullaccess: S3 bucket を作成および設定するため。
- Amazonsqsfullaccess: トリガーに使用される SQS queue を作成および設定するため。
- Awslambda_fullaccess: Glasswall Halo への呼び出しを実行する lambda function を作成および設定するため。
- (任意) iamfullaccess: 新しい function のデフォルト実行 role を作成および設定するために必要です。この role を割り当てられない場合は、このガイドの該当する手順に従って role の作成を依頼し、その後この事前作成済み role を使用してください。
-
Glasswall Halo の synchronous API への認証済みアクセス。
ステップ 1 - S3 bucket を作成する
まず、ソースファイルが追加される S3 bucket を作成する必要があります。これは workflow をトリガーするイベントのソースになります。
-
AWS management console にログインします。
-
Navigate to the Amazon S3 console by entering “S3” in the search bar or by selecting S3 under the Services > Storage menu.

-
左側のナビゲーションペインで、Buckets を選択します。
-
Create bucket をクリックします。Create bucket ページが開きます。

- bucket name には、バケットの名前を入力します。バケット名は次の条件を満たす必要があります:
- パーティション内で一意であること。パーティションはリージョンのグループ化を指します。AWS には現在 3 つのパーティションがあります:
aws(標準リージョン)、aws-cn(中国リージョン)、aws-us-gov(AWS GovCloud (US) リージョン)。 - 3 文字以上 63 文字以下であること。
- 小文字、数字、ドット (.)、およびハイフン (-) のみで構成してください。互換性を最大限に高めるため、静的ウェブサイトホスティング専用のバケットを除き、バケット名でドット (.) を使用しないことを推奨します。
- 文字または数字で始まり、文字または数字で終わるようにしてください。
バケット名はグローバルで一意です。入力したバケット名がすでに使用されている場合は、AWS コンソールの検証で通知されます。
注: バケットを作成した後は、その名前を変更できません。バケットの命名に関する詳細については、bucket naming rulesを参照してください。
- Region では、バケットを配置する AWS リージョンを選択します。
注: レイテンシーとコストを最小限に抑え、規制要件に対応するため、近いリージョンを選択してください。リージョンに保存されたオブジェクトは、明示的に別のリージョンへ転送しない限り、そのリージョンを離れることはありません。Amazon S3 の AWS リージョン一覧については、amazon web services general reference のAWS service endpointsを参照してください。
アクセス制御、ロギング、バージョニング、暗号化など、バケットに追加設定が必要な場合は、それに応じて設定できます。
さらに、権限設定セクションでは、bucket policies、access control lists (ACLs)、または block all public access などのオプションを選択して、バケットとそのオブジェクトにアクセスできるユーザーを定義できます。続行する前に、要件に応じてこれらの設定を確認し、設定してください。
S3 バケットの作成と設定に関するより詳細な情報については、AWS S3 user guideを参照してください。
ステップ 2 - SQS キューを作成
S3 バケットの作成後、Amazon SQS (Simple Queue Service) キューを作成する必要があります。ここにソース S3 バケットからのイベント通知が送信され、Lambda 関数によって取得されます。
-
Navigate to the Amazon SQS console by searching for “SQS” in the search bar or by selecting Simple Queue Service under the Services > Application integration menu.
-
Create queue をクリックします。

- 2 種類の SQS キュー、Standard または FIFO のいずれかを選択します。
Standard キューは高スループットとベストエフォートの順序付けを提供し、FIFO キューはメッセージグループ ID に基づく「exactly once」の処理と厳密な順序付けを保証します。標準のキュータイプがデフォルトで設定されています。
Note: キュータイプは一度作成すると変更できません。
- キューに一意のNameを入力します。例: s3cdrevents。
FIFO キューの名前は、.fifoサフィックスで終わる必要があります。このサフィックスは、80 文字のキュー名クォータに含まれます。キューがfifoかどうかを判断するには、キュー名がこのサフィックスで終わっているかを確認します。
-
コンソールでは、キューのconfiguration parametersにデフォルト値が設定されます。SQS に慣れている場合は、Configurationで各パラメータの新しい値を設定できます。このユースケースでは、これらのほとんどをデフォルトのままにします。
-
Access policyセクションまでスクロールします。
-
S3 サービスがキューにメッセージを発行できるようにするため、Advancedオプションを選択し、高度なエディタで policy JSON を編集します。
-
“__owner_statement” 要素の後にカンマを追加し、次の JSON スニペットを貼り付けます。
{
"Sid": "AllowS3ToPublish",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sqs:SendMessage",
"Resource": "<ARN-OF-QUEUE>"
}
Note: スニペット内のarn-of-queueをキューの ARN (Amazon Resource Name) に置き換えていることを確認してください。これは、既存の JSON 内の owner statement の resource ARN と同じです。

- 入力した設定値を確認し、Create queueをクリックします。
後で使用するために、キューの ARN を控えておきます。
Amazon SQS の作成と設定に関するより詳細な情報については、AWS S3 user guideを参照してください。
ステップ 3 - イベント通知を有効にする
次のステップでは、イベント通知を有効にして、ソース S3 バケットにファイルが配置されるたびに SQS キューが通知を受信するようにします。
-
Amazon S3 コンソールに移動し、Bucketsリストから先ほど作成したバケットを選択します。
-
Bucket overviewページで、Propertiesタブを選択します。
-
Event notificationsセクションまでスクロールし、Create event notificationをクリックします。
-
General configuration セクションで、イベント通知用のわかりやすいEvent nameを指定します。必要に応じて、指定した文字で終わるキーを持つオブジェクトに通知を限定するため、Prefix と Suffix を指定することもできます。
-
Event types セクションでは、通知を受け取りたいイベントタイプを1つ以上選択できます。この例では、CDR がオブジェクトに対して実行される通知が新規またはコピーされたオブジェクトによって生成されるよう、Object creation イベントに焦点を当てます。
All object create events チェックボックスを選択します。

- 最後に、Destination セクションでイベント通知の送信先を選択します。この場合は、作成して設定済みの SQS queue です。
送信先として SQS queue を選択し、先ほど作成して設定した SQS queue を選びます。
- Save changes を選択すると、Amazon S3 はイベント通知の送信先にテストメッセージを送信します。
イベント通知が作成され、S3 bucket のプロパティ画面に戻ります。
イベント通知の詳細については、AWS S3 user guide を参照してください。
ステップ 4 - Lambda function を作成する
イベント通知を有効にしたら、新しい Lambda function を作成する必要があります。
-
Navigate to the Lambda service by searching for “Lambda” in the search bar or by selecting Lambda under the Services > Compute menu.
-
左側のナビゲーションペインで、Functions を選択します。
-
Create function をクリックします。
-
Create function ページでは 3 つのオプションが表示されます。Author from scratch を選択します。
-
Lambda 関数に適切な Function name を入力します。例: CDR-file。

- 次に、想定する言語に一致する Runtime を選択します。
注: サンプルコードは Glasswall github から確認できます。コードのアップロードは後の手順で行えます。
-
(Optional) If you are familiar with Lambda functions, you can set additional configurations via the General configuration option under the Configurations tab.
-
Create function をクリックします。Function overview ページが表示されます。

- Assigning the execution role can be done in two ways:
- iamfullaccess を使用して新しい role をリクエストして割り当てる
- Assigning an already existing role
- これは Lambda service から実行できます:Function overview > Configuration > Permissions > Edit。
[任意] iamfullaccess
iamfullaccess 権限を割り当てられない場合は、次の権限を持つ role の作成を依頼してください。
Logs :createlogstream
Logs :putlogevents
role を作成するために、Configure execution role ステップで完成した JSON を権限のあるユーザーに渡してください。
この新しい role は、新しいデフォルト role の作成を許可する代わりに、Lambda 作成ユーザーインターフェースから選択できます。
- Change default execution role セクションまでスクロールします。
- Use an existing role を選択し、事前に作成した role を指定します。
これで execution role を設定する次のステップはスキップでき、Step 6 - Upload lambda code に進めます。
ステップ 5 - execution role を設定する
Lambda function が AWS services(S3、SQS)にアクセスできるようにするには、Lambda の execution role に追加の権限を割り当てる必要があります。
-
AWS Lambda コンソールで、左側のナビゲーションペインから Functions を選択します。
-
Lambda 関数の詳細ページで、Configuration タブを選択し、次に左側のナビゲーションペインで Permissions をクリックします。
-
Execution role の下で、ロール名のリンクを選択します。IAM コンソールが開きます。
-
Lambda 関数の実行ロールに関する IAM コンソールの Summary ページで、Permissions タブを選択します。
-
Add permissions メニューから、Create inline policy を選択します。
-
JSON エディタに切り替えます。
-
以下のスニペットで、以下のセクション(resource)を、前の手順で作成して控えておいた SQS キューの ARN に置き換えます。
Arn:AWS:sqs:{region}:{account}:{queuename}"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "UseCaseStatement0",
"Effect": "Allow",
"Action": [
"sqs:DeleteMessage",
"sqs:GetQueueUrl",
"sqs:ReceiveMessage",
"sqs:GetQueueAttributes",
"sqs:ListQueueTags"
],
"Resource": [
"arn:aws:sqs:{Region}:{Account}:{QueueName}"
]
},
{
"Sid": "UseCaseStatement1",
"Effect": "Allow",
"Action": [
"sqs:ListDeadLetterSourceQueues",
"sqs:ListMessageMoveTasks",
"sqs:ListQueues",
"s3:GetObject",
"s3:CreateBucket",
"s3:PutObject"
],
"Resource": "*"
}
]
}
-
更新したリソースを含めて、このスニペットを JSON エディタに貼り付けます。
-
Next をクリックします。
-
policy に Name を付けます。例: usecasepolicy。
-
Create policy をクリックします。
これで、Lambda 関数には必要なサービスとやり取りするための権限が付与されました。
ステップ 6 - Lambda コードをアップロード
ファイルがソース S3 バケットにアップロードされたとき、それらを処理するために、Lambda が呼び出された際に実行されるコードが必要です。
使用するフレームワークによって、意図したコードを実行する Lambda 関数を動作させる方法は複数ありますが、このガイドでは zip アップロード機能に焦点を当てます。
フレームワークに関係なく、Lambda 関数には次のロジックが必要です。
- ファイルの取得: SQS メッセージを解釈して、ソースバケットからファイルを取得します。
- CDR ファイル: Glasswall Halo Rest API に対して認証済みリクエストを実行します。
- レスポンスの処理: 成功・失敗の両方のレスポンスを処理します。
開始にあたってさらに詳しい情報が必要な場合は、このロジックを実装した完全なサンプルコードベースを Glasswall engineering github で確認できます。このリポジトリには、ここで作成した Lambda へのアップロード手順を含むサンプルコードが用意されています。さらに、Lambda 関数で使用できるビルド済みの zip ファイルもあります。.md ファイル内の手順を参照してください。
ステップ 7 - トリガーを追加
このステップでは、トリガーを追加して、キューに SQS メッセージが公開されたときに Lambda 関数が呼び出されるよう設定します。
-
関数のコンソールページにある Function の概要ペインで、Add trigger を選択します。
-
利用可能なトリガーの一覧から SQS を選択します。
-
先ほど作成した SQS キューを選択し、Add をクリックします。

これでプロセスは完了し、テストの準備が整いました。
ステップ 8 - テスト
すべての設定が完了したら、ソース S3 バケットにファイルをアップロードします。数秒以内に、同じ名前のファイルがクリーンな S3 バケットに表示されます。


このファイルは元のファイルと見た目が同一のクリーンコピーであり、マルウェアを含む可能性のある危険なコンテンツや構造上の欠陥は含まれていません。
Glasswall Halo Portal で確認
-
Glasswall のClean a fileアプリケーションを使用して元のファイルを処理します。
- ファイルには、一覧表示されたリスクのあるコンテンツ項目または構造上の欠陥とともに、リスクレベルが付与されます。
-
Clean a fileアプリケーションで、clean S3 bucket 内のクリーンアップ済みファイルを処理します。
- ファイルは、リスクのあるコンテンツや構造上の欠陥がないクリーンな状態で返されるはずです。