S3にファイルがSFTPアップロードされたことを検知してLambdaを起動する( `aws-cli` で構築)
以下のような仕組みを作る必要がありました。
- ユーザにSFTPプロトコルを使って、S3にファイルをアップロードしてもらう。
- S3にファイルがアップロードされたことを検知して、何らかの処理を行う。
AWSのサービスを組みわせて、かつできる限り aws-cli
のみを使ってコマンドラインで仕組みを構築してみました。
今回は、 「何らかの処理」 として Lambdaファンクションを使ってCloudWatchLogにログを書き出させてみます 。
※注意:IAM周りの設定はかなり大雑把に設定しているので、参考する場合にはもっと考慮が必要!
簡易構成図
設定パラメータを整理
AWSの各種サービス設定時に必要となる情報を事前にまとめておきました。
設定項目 | 設定値 |
---|---|
AWS Transfer 実行ユーザ名(SFTPログインユーザ) | g-trigger-bucket-transfer-user |
AWS Transfer 実行ロール名 | g-trigger-bucket-transfer-role |
S3 バケット名 | g-trigger-bucket |
S3 バケット イベント名 | g-trigger-bucket-event |
Lambda ファンクション名 | g-trigger-function |
Lambda 実行ロール名 | g-trigger-function-role |
事前準備
aws-cli
(AWSコマンドの利用可能な環境づくり)
aws-cli
の利用可能環境は、以下のエントリを参考に構築済み。
AWSサービスの設定開始
AWS S3バケットの作成
S3バケットの作成やファイルのアップロードをコマンドラインから操作する方法は、 以下のエントリで整理済み。
参考にしながら設定を進める。
AWS Lambdaファンクションの作成
AWS Lambda ファンクションの作成や呼び出しをコマンドラインから操作する方法は、 以下のエントリで整理済み。
参考にしながら設定を進める。
実行ロールの作成
実行時に出力されたJSONメッセージのうち、 Arn
の部分は後々必要となるためメモしておく 。
ファンクションを作成
CloudWatch Logs にログを記録するLambdaファンクションをコーディングし、デプロイします。
最後のコマンド実行後には、以下のようなJSON情報が出力されます。
出力内容のうち、 "FunctionArn"の値はこの後使用するため、メモしておきましょう。
AWS S3バケットのイベントフックを設定
S3にファイルがアップロードされたタイミングでLambdaファンクションを起動させる設定を行います。
まずは先程作成したLambdaファンクションに対して、S3イベントフック可能な権限を与えておきましょう。
S3にイベントの設定を行います。
ファイルが作成されたタイミングでイベントが発火するように設定。
AWS Transferを設定
最後に S3 に対して SFTP プロトコルを使ってファイルをアップロードするための口を設定します。
( この手順に関しては、今までブログで整理していなかったので初めて設定してみました。 )
サーバの作成
実行結果のJSONに出力されている ServerId
の値は後に必要となるためメモしておきます。
SFTP用ロール作成
最後のコマンド実行後には、以下のようなJSON情報が出力されます。
出力内容のうち、 "Arn"の値はこの後使用するため、メモしておきます。
{
"Role": {
"Path": "/",
"RoleName": "g-trigger-bucket-transfer-role",
"RoleId": "AROAJR26G65QLOYSINCNK",
"Arn": "arn:aws:iam::642942901536:role/g-trigger-bucket-transfer-role",
"CreateDate": "2019-02-27T22:41:09Z",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
}
}
SFTPユーザの作成・公開鍵登録
- 最後に登録した サーバ に対して、 SFTPロール を持つユーザを作成します。
- 作成後はSSH公開鍵を登録
- 端折ってしまったが、次のファイルは事前に
ssh-keygen
コマンドなどを使って作成しておく必要があります。 ~/.ssh/id_rsa.pub
- 端折ってしまったが、次のファイルは事前に
動作確認
ファイルアップロード
SFTPでログインしてみます。
先程作成した AWS Transfer For SFTP サーバだが、ホスト名は以下のルールで付与されていました。
<サーバID>.server.transfer.<リージョンID>.amazonaws.com
今回は、 s-40bb881352ed42cb8.server.transfer.ap-northeast-1.amazonaws.com
となる。
※ちなみに、SFTPサーバの起動までには5分程度かかるので、接続失敗しても気長に待ってみることをおすすめします。
正常にログインできたので、ファイルをアップロードしてみます。
CloudWatchLogが正しく書き出されているかを確認
以下のページにログインしてみて、ログが出力されているかを確認してみたところ、無事書き出しされていました。
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logs:
正しくログが出力された。
Lambdaファンクションの第一引数 event
の情報から、アップロードされたS3バケット上のファイルパスを特定することができます。
以下のようにすれば、JavaScriptでS3上のURLが生成できます。
ゴミ掃除
検証が終わったらゴミ掃除。
ディスカッション
コメント一覧
まだ、コメントがありません