From 0d4e736bfb6062bc874cd71a148beab923befe22 Mon Sep 17 00:00:00 2001
From: Lennart Nordgreen <lennart.nordgreen@uib.no>
Date: Tue, 11 Feb 2020 09:55:41 +0100
Subject: [PATCH] Draft - Work in progress - beta.ordbok.uib.no_stack.yaml

---
 aws/beta.ordbok.uib.no_stack.yaml | 233 ++++++++++++++++++++++++++++++
 1 file changed, 233 insertions(+)

diff --git a/aws/beta.ordbok.uib.no_stack.yaml b/aws/beta.ordbok.uib.no_stack.yaml
index e69de29b..7e8d83e0 100644
--- a/aws/beta.ordbok.uib.no_stack.yaml
+++ b/aws/beta.ordbok.uib.no_stack.yaml
@@ -0,0 +1,233 @@
+AWSTemplateFormatVersion: '2010-09-09'
+
+Description: >
+  Script to create S3 bucket, DNS (Route53) and Cloudfront distribution.
+
+###############################################################################
+Parameters:
+###############################################################################
+
+  DomainName:
+    Type: String
+    Description: The domain name.
+    Default: 'ordbok.aws.uib.no'
+    AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
+    ConstraintDescription: must be a valid DNS zone name
+    
+  DomainPrefix:
+    Type: String
+    Default: beta
+    
+  PriceClass:
+    Type: String
+    Description: The CloudFront distribution price class
+    Default: 'PriceClass_100'
+    AllowedValues:
+      - 'PriceClass_100'
+      #- 'PriceClass_200'
+      #- 'PriceClass_All'
+
+  SecretArn:
+    Type: String
+    
+  CertificateArn:
+    Type: String
+    Default: ''
+
+    
+Conditions:
+  UseDomain: !Not [!Or [!Equals [!Ref DomainName, ''], !Equals [!Ref CertificateArn, '']]]
+  
+###############################################################################
+Resources:
+###############################################################################
+
+  DNS:
+    Type: "AWS::Route53::RecordSet"
+    Condition: UseDomain
+    Properties:
+      HostedZoneConfig:
+        Comment: !Join ['', ['Hosted zone for ', !Ref 'DomainName']]
+      HostedZoneName: !Join ['.', [!Ref DomainName, '']]
+      Name: !Join ['.', [!Ref DomainPrefix, !Ref DomainName, '']]
+      Type: A
+      AliasTarget:
+        HostedZoneId: xxxxxxxxxxx
+        DNSName: !GetAtt Distribution.DomainName
+      HostedZoneTags:
+      - Key: Application
+        Value: beta.ordbok.uib.no
+
+        
+  WebBucket:
+    Type: "AWS::S3::Bucket"
+    Properties:
+      BucketName: !Sub "${AWS::StackName}.aws.uib.no"
+      VersioningConfiguration:
+        Status: Enabled
+      AccessControl: !If
+        - UseDomain
+        - !Ref "AWS::NoValue"
+        - "PublicRead"
+      WebsiteConfiguration: !If
+      - UseDomain
+      - !Ref "AWS::NoValue"
+      - IndexDocument: index.html
+      Tags:
+        - Key: Application
+          Value: !Ref DomainName
+  
+
+  BucketPolicy:
+    Type: "AWS::S3::BucketPolicy"
+    Properties:
+      PolicyDocument:
+        Id: MyPolicy
+        Version: 2012-10-17
+        Statement:
+          - Sid: PublicReadForGetBucketObjects
+            Effect: Allow
+            Principal: !If
+              - UseDomain
+              - CanonicalUser: !GetAtt CloudFrontOriginIdentity.S3CanonicalUserId
+              - "*"
+            Action: !If
+              - UseDomain
+              - 's3:*'
+              - 's3:GetObject'
+            Resource: !Join
+              - ''
+              - - 'arn:aws:s3:::'
+                - !Ref WebBucket
+                - /*
+      Bucket: !Ref WebBucket
+      
+      
+  ItaIpSet:
+    Type: "AWS::WAF::IPSet"
+    Condition: UseDomain
+    Properties:
+      IPSetDescriptors:
+      - Type: "IPV4"
+        Value: "129.177.0.0/16"
+      Name: "allowed IPs"
+  
+  
+  ITARule:
+    Type: "AWS::WAF::Rule"
+    Condition: UseDomain
+    Properties:
+      MetricName: "ITARule"
+      Name: "ITARule"
+      Predicates:
+      - Type: "IPMatch"
+        Negated: false
+        DataId: !Ref ItaIpSet
+        
+        
+  ACL:
+    Type: "AWS::WAF::WebACL"
+    Condition: UseDomain
+    Properties:
+      DefaultAction:
+        Type: "BLOCK"
+      Name: "intern ITA"
+      MetricName: "WebACL"
+      Rules:
+        - Action:
+            Type: "ALLOW"
+          Priority: 1
+          RuleId: !Ref ITARule
+          
+          
+  Distribution:
+    Type: "AWS::CloudFront::Distribution"
+    Condition: UseDomain
+    Properties:
+      DistributionConfig:
+        Enabled: true
+        HttpVersion: http2
+        PriceClass: !Ref PriceClass
+        Enabled: 'true'
+        DefaultRootObject: index.html
+        Origins:
+        - DomainName: !Sub "${WebBucket}.s3-${AWS::Region}.amazonaws.com"
+          Id: s3ProductionBucket
+          S3OriginConfig:
+            OriginAccessIdentity: !Sub "origin-access-identity/cloudfront/${CloudFrontOriginIdentity}"
+        Aliases:
+        - !Join ['.', [!Ref DomainPrefix, !Ref DomainName]]
+        CustomErrorResponses:
+          - ErrorCachingMinTTL: 300
+            ErrorCode: 403
+            ResponseCode: 200
+            ResponsePagePath: /index.html
+          - ErrorCachingMinTTL: 300
+            ErrorCode: 404
+            ResponseCode: 200
+            ResponsePagePath: /index.html
+        DefaultCacheBehavior:
+          AllowedMethods:
+          - GET
+          - HEAD
+          Compress: true
+          TargetOriginId: s3ProductionBucket
+          ForwardedValues:
+            QueryString: 'false'
+            Cookies:
+              Forward: none
+          ViewerProtocolPolicy: redirect-to-https
+        ViewerCertificate:
+          AcmCertificateArn: !Ref CertificateArn
+          MinimumProtocolVersion: TLSv1.1_2016
+          SslSupportMethod: sni-only
+        WebACLId: !If
+          - UseDomain
+          - !Ref ACL
+          - !Ref "AWS::NoValue"
+
+  CloudFrontOriginIdentity:
+    Type: "AWS::CloudFront::CloudFrontOriginAccessIdentity"
+    Properties:
+      CloudFrontOriginAccessIdentityConfig:
+        Comment: "origin identity"
+       
+  XRayPolicy:
+    Type: 'AWS::IAM::ManagedPolicy'
+    Properties:
+      ManagedPolicyName: !Sub "${AWS::StackName}-XRayPolicy"
+      PolicyDocument:
+        Version: 2012-10-17
+        Statement:
+        - Action:
+          - 'xray:PutTelemetryRecords'
+          - 'xray:PutTraceSegments'
+          Effect: Allow
+          Resource: '*'
+          
+          
+  S3LambdaRole:
+    Type: "AWS::IAM::Role"
+    Properties:
+      AssumeRolePolicyDocument:
+        Version: "2012-10-17"
+        Statement:
+        - Effect: "Allow"
+          Principal:
+            Service:
+            - "lambda.amazonaws.com"
+          Action:
+          - "sts:AssumeRole"
+      ManagedPolicyArns:
+        - "arn:aws:iam::aws:policy/AmazonS3FullAccess"
+        - !Ref XRayPolicy
+      Policies:
+        - PolicyName: !Sub "${AWS::StackName}-SecretsPolicy"
+          PolicyDocument:
+            Version: 2012-10-17
+            Statement:
+              - Action: 'secretsmanager:GetSecretValue'
+                Effect: Allow
+                Resource: !Ref SecretArn
+      RoleName: !Sub "${AWS::StackName}-S3LambdaRole"
+
-- 
GitLab