cloudformation/secure-contact-lambda.yaml (85 lines of code) (raw):

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Run the SecureContact Lambda in AWS Parameters: ArtifactBucket: Description: Name of the S3 bucket where the artifact is located Type: String PublicBucketName: Description: Name to use for the public S3 bucket that will serve content Type: String Stage: Description: Application stage Type: String AllowedValues: - PROD - CODE - DEV Default: PROD App: Description: Application name Type: String Default: secure-contact-lambda Stack: Description: Application stack Type: String Default: secure-contact Resources: # ----------------------- # # S3 BUCKETS FOR APP # # ----------------------- # PublicBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain Properties: AccessControl: PublicRead BucketName: !Ref PublicBucketName LifecycleConfiguration: Rules: - ExpirationInDays: 7 Status: Enabled WebsiteConfiguration: IndexDocument: index.html ErrorDocument: 404.html Tags: - Key: App Value: !Ref App - Key: Stack Value: !Ref Stack - Key: Stage Value: !Ref Stage PublicBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: Ref: PublicBucket PolicyDocument: Statement: - Action: - s3:GetObject Effect: Allow Resource: - !Sub arn:aws:s3:::${PublicBucket}/* Principal: "*" LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: {Service: [lambda.amazonaws.com]} Action: ['sts:AssumeRole'] Path: / ManagedPolicyArns: - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" Policies: - PolicyName: public-bucket-upload PolicyDocument: Statement: # grant access to the S3 bucket that will hold the website contents - Effect: Allow Resource: !Sub arn:aws:s3:::${PublicBucketName} Action: - s3:ListBucket - Effect: Allow Resource: !Sub arn:aws:s3:::${PublicBucketName}/* Action: - s3:PutObject - s3:DeleteObject