Package: cdk-efs-assets
cdk-efs-assetsCDK construct library to populate Amazon EFS assets from Github or S3. If the source is S3, the construct also optionally supports updating the contents in EFS if a new zip file is uploaded to S3.InstallTypeScript/JavaScript:npmicdk-efs-assetsSyncedAccessPointThe main construct that is used to provide this EFS sync functionality isSyncedAccessPoint. This extends the standard EFSAccessPointconstruct, and takes an additionalSyncSourceconstructor property which defines the source to sync assets from. TheSyncedAccessPointinstance can be used anywhere anAccessPointcan be used. For example, to specify a volume in a Task Definition:consttaskDefinition=newecs.FargateTaskDefinition(this,'TaskDefinition',{...volumes:[{name:'efs-storage',efsVolumeConfiguration:{fileSystemId:sharedFileSystem.fileSystemId,transitEncryption:'ENABLED',authorizationConfig:{accessPointId:syncedAccessPoint.accessPointId}}},]});Sync EngineThis library supports bothAWS FargateandAWS Lambdaas the sync engine. As AWS Lambda currently has know issue with Amazon EFS(#100), the default sync engine isAWS Fargate. You can opt in AWS Lambda with theengineconstruct property ofSyncedAccessPoint.Sync SourceUseGithubSyncSourceandS3ArchiveSyncSourceconstruct classes to define yoursyncSourcefrom Github
or Amazon S3 bucket. For example:To define a public github repository as thesyncSource:newSyncedAccessPoint(stack,'EfsAccessPoint',{...syncSource:newGithubSyncSource({vpc,repository:'https://github.com/pahud/cdk-efs-assets.git',}),});To define a private github repository as thesyncSource:newSyncedAccessPoint(stack,'EfsAccessPoint',{...syncSource:newGithubSyncSource({vpc,repository:'https://github.com/pahud/private-repo.git',secret:{id:'github',key:'oauth_token',},}),});syncDirectoryPathBy default, the synced EFS assets are placed into a directory corresponding to the type of the sync source. For example, the default behavior of the GitHub source is to place the copied files into a directory named the same as the repository name (for a repository specified as 'https://github.com/pahud/cdk-efs-assets.git', the directory name would be 'cdk-efs-assets'), while the default behavior of the S3 archive source is to place the copied files into a directory named the same as the zip file (for a zip file name of 'assets.zip', the directory name would be 'assets').If you wish to override this default behavior, specify a value for thesyncDirectoryPathproperty that is passed into theSyncSourcecall.If you are using theAccessPointin an ECS/Fargate Task Definition, you probably will want to override the value ofsyncDirectoryPathto '/'. This will place the file contents in the root directory of the Access Point. The reason for this is that when you create a volume that is referencing an EFS Access Point, you are not allowed to specify any path other than the root directory in the task definition configuration.How to use SyncedAccessPoint initialized with files provisioned from GitHub repositoryThis will sync assets from a GitHub repository to a directory (by default, the output directory is named after the repository name) in the EFS AccessPoint:import{SyncSource,SyncedAccessPoint}from'cdk-efs-assets';constapp=newApp();constenv={region:process.env.CDK_DEFAULT_REGION??AWS_DEFAULT_REGION,account:process.env.CDK_DEFAULT_ACCOUNT,};conststack=newStack(app,'testing-stack',{env});constvpc=ec2.Vpc.fromLookup(stack,'Vpc',{isDefault:true})constfileSystem=newefs.FileSystem(stack,'Filesystem',{vpc,removalPolicy:RemovalPolicy.DESTROY,})constefsAccessPoint=newSyncedAccessPoint(stack,'GithubAccessPoint',{vpc,fileSystem,path:'/demo-github',createAcl:{ownerGid:'1001',ownerUid:'1001',permissions:'0755',},posixUser:{uid:'1001',gid:'1001',},syncSource:newGithubSyncSource({vpc,repository:'https://github.com/pahud/cdk-efs-assets.git',})});Github private repository supportTo clone a github private repository, you need to generate your githubPAT(Personal Access Token)and store the token inAWS Secrets Managersecret.For example, if your PAT is stored in the AWS Secret manager with the secret IDgithuband the keyoauth_token, you can specify thesecretproperty as the sample below. Under the covers the lambda function will format the full github repository uri with yourPATand successfully git clone the private repository to the efs filesystem.Store your PAT into the AWS Secrets Manager with AWS CLI:awssecretsmanagercreate-secret\--namegithub\--secret-string'{"oauth_token":"MYOAUTHTOKEN"}'Configure thesecretproperty to allow lambda to retrieve thePATfrom the secret:newGithubSyncSource({vpc,repository:'https://github.com/username/repo.git',secret:{id:'github',key:'oauth_token',},})How to use SyncedAccessPoint initialized with files provisioned from zip file stored in S3This will sync assets from a zip file stored in an S3 bucket to a directory (by default, the output directory is named after the zip file name) in the EFS AccessPoint:import{S3ArchiveSync}from'cdk-efs-assets';constapp=newApp();constenv={region:process.env.CDK_DEFAULT_REGION??AWS_DEFAULT_REGION,account:process.env.CDK_DEFAULT_ACCOUNT,};conststack=newStack(app,'testing-stack',{env});constvpc=ec2.Vpc.fromLookup(stack,'Vpc',{isDefault:true})constfileSystem=newefs.FileSystem(stack,'Filesystem',{vpc,removalPolicy:RemovalPolicy.DESTROY,})constbucket=Bucket.fromBucketName(this,'Bucket','demo-bucket');constefsAccessPoint=newSyncedAccessPoint(stack,'EfsAccessPoint',{vpc,fileSystem,path:'/demo-s3',createAcl:{ownerGid:'1001',ownerUid:'1001',permissions:'0755',},posixUser:{uid:'1001',gid:'1001',},syncSource:newS3ArchiveSyncSource({vpc,bucket,zipFilePath:'folder/foo.zip',}),});syncOnUpdateIf thesyncOnUpdateproperty is set totrue(defaults totrue), then the specified zip file path will be monitored, and if a new object is uploaded to the path, then it will resync the data to EFS. Note that to use this functionality, you must have a CloudTrail Trail in your account that captures the desired S3 write data event.This feature is only available with theLAMBDAsync engine.WARNING: The contents of the extraction directory in the access point will be destroyed before extracting the zip file.StatefulFargateNginxThis library comes withStatefulFargateNginxconstruct which allows you to build an Amazon EFS-backed stateful
AWS Fargate service with its document root seeded from any github repository.See thistweetfor the demo.Sample:newStatefulFargateNginx(this,'NyanCat',{vpc,github:'https://github.com/cristurm/nyan-cat.git',});