S3ã¬ããªã±ã¼ã·ã§ã³å®äºãããªã¬ã¼ã«Lambdaã§ãã¡ã¤ã«ãæ¥ä»ãªãã¼ã ããèªåå
ã¯ããã«
ããã«ã¡ã¯ãã¯ã©ã¦ãäºæ¥é¨ã®æ¾å²¡ã§ãã ã¤ã³ãã©ã¨ã³ã¸ãã¢3å¹´ç®ãAWSçµé¨3ãæã®ç§ããS3ã®ã¬ããªã±ã¼ã·ã§ã³æ©è½ã¨EventBridge + Lambdaãçµã¿åããã¦ãåæããããã¡ã¤ã«ãèªåã§æ´çï¼æ¥ä»ãªãã¼ã ï¼ããä»çµã¿ãæ§ç¯ãã¾ããã
ãAWSã®è¤æ°ãªã½ã¼ã¹ãçµã¿åããã¦è§¦ã£ã¦ã¿ãããã¨ããåç´ãä¸ç´è ã®æ¹ã«åãã¦ãå®åã§æèãã¹ãæå°æ¨©éã®ååãå«ããæé ãç´¹ä»ãã¾ãã
ã·ã¹ãã æ§æå³
æ¬æ§æã§ã¯ãS3éã®ã¬ããªã±ã¼ã·ã§ã³ãå®äºãããã¨ãEventBridgeã§æ¤ç¥ããå³åº§ã«Lambdaããã¡ã¤ã«åã夿´ãã¦ç¹å®ã®ãã£ã¬ã¯ããªã¸æ´çããä»çµã¿ãæ¡ç¨ãã¦ãã¾ãã

å¦çã®æµã
- ã¢ãããã¼ã: ã¦ã¼ã¶ã¼ã
filetransfer-dev-source-bucketã¸ãã¡ã¤ã«ãé ç½®ã - åæ: S3ã®ã¬ããªã±ã¼ã·ã§ã³æ©è½ã«ãã
filetransfer-dev-destination-bucketã¸èªåã³ãã¼ã - æ¤ç¥: EventBridgeãéä¿¡å ãã±ããã¸ã®é ç½®ï¼Object Createdï¼ããªã¢ã«ã¿ã¤ã ã§æ¤ç¥ã
- ãªãã¼ã : Lambdaãèµ·åãé
ç½®æéããã¡ã¤ã«åã«ä»ä¸ãã
processed/ãã£ã¬ã¯ããªã¸ç§»åã
æ§ç¯ãªã½ã¼ã¹ä¸è¦§
ãªã½ã¼ã¹å㯠{systemname}-{Env}-{Resourcename} ã®è¦åã«å¾ãã管çã容æã«ãã¦ãã¾ãã
ä¸è¨ã«YAMLãã¡ã¤ã«ãé ç½®ãã¦ããã®ã§å¿ è¦ã§ããããå©ç¨ãã ãã
https://github.com/tmatusoka-apc/s3-filetransfer.git
| ã«ãã´ãª | ãªã½ã¼ã¹å | åè |
|---|---|---|
| S3 (Source) | filetransfer-dev-source-bucket |
ãã¼ã¸ã§ãã³ã°æå¹ / ã¬ããªã±ã¼ã·ã§ã³å |
| S3 (Dest) | filetransfer-dev-destination-bucket |
ãã¼ã¸ã§ãã³ã°æå¹ / EventBridgeéç¥æå¹ |
| EventBridge | filetransfer-dev-s3-put-rule |
Object Created ã¤ãã³ããç£è¦ |
| Lambda | filetransfer-dev-rename-function |
Python 3.12 / ç¡éã«ã¼ã鲿¢å®è£ æ¸ã¿ |
| IAM Role | filetransfer-dev-replication-role |
S3éã®ã³ãã¼æ¨©éï¼æå°æ¨©éï¼ |
| IAM Role | filetransfer-dev-lambda-role |
éä¿¡å S3ã®æä½ã¨ãã°åºå権é |
1. S3ã¬ããªã±ã¼ã·ã§ã³ã®è¨å®
S3éã®ãã¼ã¿åæãå®å ¨ã«è¡ãããã®è¨å®ã§ãã
è¨å®ã®ãã¤ã³ã
- ãã¼ã¸ã§ãã³ã°: ã¬ããªã±ã¼ã·ã§ã³ã®å¿ é è¦ä»¶ã®ããã両ãã±ããã§æå¹åãã¾ãã
- æå°æ¨©éã®IAMãã¼ã«:
s3.amazonaws.comãä¿¡é ¼ããªã·ã¼ã«è¨å®ã- 許å¯ããªã·ã¼ã§ã¯ãSourceããã®
GetObject㨠Destinationã¸ã®ReplicateObjectã«éå®ãã¦è¨è¿°ãã¾ãã
2. Lambdaã«ãããã¡ã¤ã«è»¢éã®å®è£
EventBridgeããèµ·åãããLambdaãæ§ç¯ãã¾ãã
権éå¨ãã®è¨è¨
æ¬çªç°å¢ãæèãã以ä¸ã®æ¨©éãæã¤IAMãã¼ã«ã使ãã¾ãã
* S3: GetObject, PutObject, DeleteObjectï¼éä¿¡å
ãã±ããã®ã¿ï¼ã
* CloudWatch Logs: å®è¡ãã°ï¼/aws/lambda/filetransfer-dev-rename-functionï¼ã®æ¸ãè¾¼ã¿æ¨©éã
Lambdaã³ã¼ãï¼æç²ï¼
S3ã«ã¯ããªãã¼ã ãã³ãã³ããåå¨ããªãããããã³ãã¼ ï¼ åé¤ãã®æé ãè¸ã¿ã¾ãã
import boto3 import os from datetime import datetime s3 = boto3.client('s3') def lambda_handler(event, context): bucket = event['detail']['bucket']['name'] old_key = event['detail']['object']['key'] # ç¡éã«ã¼ã鲿¢: æ¢ã«å¦çæ¸ã¿ãã£ã¬ã¯ããªã«ããå ´åã¯ã¹ããã if old_key.startswith('processed/'): return # é ç½®ãããæéãåå¾ï¼YYYYMMDD-HHMMSSå½¢å¼ï¼ timestamp = datetime.now().strftime('%Y%m%d-%H%M%S') new_key = f"processed/{timestamp}_{os.path.basename(old_key)}" print(f"Moving: {old_key} -> {new_key}") # åä¸ãã±ããå ã§ã®ã³ãã¼ï¼å ã®ãªãã¸ã§ã¯ãåé¤ s3.copy_object( Bucket=bucket, CopySource={'Bucket': bucket, 'Key': old_key}, Key=new_key ) s3.delete_object(Bucket=bucket, Key=old_key) return {"status": "success"}
3. å®è¡ç¢ºèª
- Sourceã¸ã¢ãããã¼ã:
test.pngãã¢ãããã¼ãã - ã¬ããªã±ã¼ã·ã§ã³ç¢ºèª: Destinationã¸
test.pngãå±ãã®ã確èªã - CloudWatch Logsã確èª: Lambdaãæ£å¸¸ã«èµ·åãã
Moving...ã®ãã°ãåºã¦ããããã§ãã¯ã - æçµçµæ: Destinationã®
processed/é ä¸ã«20260129-120000_test.pngãçæãããå ã®ãã¡ã¤ã«ãæ¶ãã¦ããã°æåã
ãããã«
ã¤ã³ãã©ã¨ã³ã¸ãã¢ã¨ãã¦ãåã«ãåããã ãã§ãªãããæ¨©éãé©åãããå¾ã§åé¤ã夿´ãããããå½åè¦åã«ãªã£ã¦ãããããæèããæ§ç¯ãå¿ããã¾ããã
ä»å¾ã¯ãã¨ã©ã¼çºçæã«SNSã§éç¥ããä»çµã¿ããStep Functionsãç¨ããããè¤éãªã¯ã¼ã¯ããã¼ã«ãææ¦ãã¦ã¿ããã¨æãã¾ãã