|
| 1 | +#!/usr/bin/env python3 |
| 2 | +""" |
| 3 | +Transfer FTP to S3 CDK application. |
| 4 | +""" |
| 5 | + |
| 6 | +from aws_cdk import ( |
| 7 | + App, |
| 8 | + CfnOutput, |
| 9 | + RemovalPolicy, |
| 10 | + Stack, |
| 11 | + aws_iam as iam, |
| 12 | + aws_s3 as s3, |
| 13 | + aws_transfer as transfer, |
| 14 | +) |
| 15 | +from constructs import Construct |
| 16 | + |
| 17 | + |
| 18 | +class TransferFtpS3Stack(Stack): |
| 19 | + """Stack for Transfer FTP server resources.""" |
| 20 | + |
| 21 | + def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: |
| 22 | + super().__init__(scope, construct_id, **kwargs) |
| 23 | + |
| 24 | + bucket_name = "transfer-files" |
| 25 | + username = "ftpuser" |
| 26 | + |
| 27 | + # S3 bucket for file storage |
| 28 | + bucket = s3.Bucket( |
| 29 | + self, |
| 30 | + "TransferBucket", |
| 31 | + bucket_name=bucket_name, |
| 32 | + removal_policy=RemovalPolicy.DESTROY, |
| 33 | + auto_delete_objects=True, |
| 34 | + ) |
| 35 | + |
| 36 | + # IAM role for Transfer service |
| 37 | + transfer_role = iam.Role( |
| 38 | + self, |
| 39 | + "TransferRole", |
| 40 | + role_name="transfer-role", |
| 41 | + assumed_by=iam.ServicePrincipal("transfer.amazonaws.com"), |
| 42 | + ) |
| 43 | + |
| 44 | + # Grant the role access to the bucket |
| 45 | + bucket.grant_read_write(transfer_role) |
| 46 | + |
| 47 | + # Transfer server with FTP protocol |
| 48 | + server = transfer.CfnServer( |
| 49 | + self, |
| 50 | + "TransferServer", |
| 51 | + endpoint_type="PUBLIC", |
| 52 | + identity_provider_type="SERVICE_MANAGED", |
| 53 | + protocols=["FTP"], |
| 54 | + ) |
| 55 | + |
| 56 | + # Transfer user |
| 57 | + user = transfer.CfnUser( |
| 58 | + self, |
| 59 | + "TransferUser", |
| 60 | + server_id=server.attr_server_id, |
| 61 | + user_name=username, |
| 62 | + role=transfer_role.role_arn, |
| 63 | + home_directory_type="PATH", |
| 64 | + home_directory=f"/{bucket_name}", |
| 65 | + ) |
| 66 | + |
| 67 | + # Outputs |
| 68 | + CfnOutput(self, "ServerId", value=server.attr_server_id) |
| 69 | + CfnOutput(self, "BucketName", value=bucket.bucket_name) |
| 70 | + CfnOutput(self, "Username", value=username) |
| 71 | + |
| 72 | + |
| 73 | +app = App() |
| 74 | +TransferFtpS3Stack(app, "TransferFtpS3Stack") |
| 75 | +app.synth() |
0 commit comments