Parameters: emailAddress: Type: String AllowedPattern: .+ Description: (Required) An e-mail address with which to receive deployment notifications. instanceType: Type: String Default: ml.t2.medium Description: (Required) SageMaker Notebook instance type to host the AFA dashboard (e.g. ml.t2.medium, ml.t3.xlarge, ml.t3.2xlarge, ml.m4.4xlarge) lambdamapFunctionName: Type: String Default: AfaLambdaMapFunction lambdamapBranch: Type: String Default: main afaBranch: Type: String Default: main Resources: AfaCodeBuildRole2413BF20: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: codebuild.amazonaws.com Version: "2012-10-17" Tags: - Key: Project Value: Afa Metadata: aws:cdk:path: AfaBootstrapStack/AfaCodeBuildRole/Resource AfaCodeBuildRoleDefaultPolicy1EBDF2C9: Type: AWS::IAM::Policy Properties: PolicyDocument: Statement: - Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Effect: Allow Resource: - Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - ":logs:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :log-group:/aws/codebuild/ - Ref: DeployStacksProject7C167385 - Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - ":logs:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :log-group:/aws/codebuild/ - Ref: DeployStacksProject7C167385 - :* - Action: - codebuild:CreateReportGroup - codebuild:CreateReport - codebuild:UpdateReport - codebuild:BatchPutTestCases - codebuild:BatchPutCodeCoverages Effect: Allow Resource: Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - ":codebuild:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :report-group/ - Ref: DeployStacksProject7C167385 - -* Version: "2012-10-17" PolicyName: AfaCodeBuildRoleDefaultPolicy1EBDF2C9 Roles: - Ref: AfaCodeBuildRole2413BF20 Metadata: aws:cdk:path: AfaBootstrapStack/AfaCodeBuildRole/DefaultPolicy/Resource LambdaMapCodeBuildPolicyDCA4CAA6: Type: AWS::IAM::Policy Properties: PolicyDocument: Statement: - Action: - cloudformation:CreateChangeSet - cloudformation:CreateStack - cloudformation:DeleteStack - cloudformation:DescribeStacks - cloudformation:DescribeStackEvents - cloudformation:DescribeChangeSet - cloudformation:ListChangeSets - cloudformation:ListStackResources - cloudformation:TagResources - cloudformation:UpdateStack - cloudformation:GetTemplate - cloudformation:ExecuteChangeSet - cloudformation:DeleteChangeSet Effect: Allow Resource: - Fn::Join: - "" - - "arn:aws:cloudformation:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :stack/AfaLambdaMapStack* - Fn::Join: - "" - - "arn:aws:cloudformation:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :stack/ - Ref: AWS::StackName - /* - Fn::Join: - "" - - "arn:aws:cloudformation:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :stack/AfaStack* - Fn::Join: - "" - - "arn:aws:cloudformation:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :stack/CDKToolkit/* - Action: - iam:DeletePolicy - iam:CreateRole - iam:AttachRolePolicy - iam:PutRolePolicy - iam:PassRole - iam:DetachRolePolicy - iam:DeleteRolePolicy - iam:GetRole - iam:GetPolicy - iam:UpdateRoleDescription - iam:DeleteRole - iam:CreatePolicy - iam:UpdateRole - iam:GetRolePolicy - iam:DeletePolicyVersion - iam:TagRole - iam:TagPolicy Effect: Allow Resource: - Fn::Join: - "" - - "arn:aws:iam::" - Ref: AWS::AccountId - :role/AfaLambdaMapStack* - Fn::Join: - "" - - "arn:aws:iam::" - Ref: AWS::AccountId - :role/cdk-* - Fn::Join: - "" - - "arn:aws:iam::" - Ref: AWS::AccountId - :role/AfaStack* - Fn::Join: - "" - - "arn:aws:iam::" - Ref: AWS::AccountId - :role/cdk-*- - Ref: AWS::AccountId - "-" - Ref: AWS::Region - Fn::Join: - "" - - "arn:aws:iam::" - Ref: AWS::AccountId - :policy/AfaLambdaMapStack* - Fn::Join: - "" - - "arn:aws:iam::" - Ref: AWS::AccountId - :policy/AfaStack* - Fn::Join: - "" - - "arn:aws:lambda:*:" - Ref: AWS::AccountId - :policy/AfaLambdaMapStack* - Fn::Join: - "" - - "arn:aws:lambda:*:" - Ref: AWS::AccountId - :policy/AfaStack* - Action: logs:CreateLogStream Effect: Allow Resource: Fn::Join: - "" - - "arn:aws:logs:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :log-group:/aws/codebuild/ - Action: - lambda:CreateFunction - lambda:GetFunction - lambda:ListTags - lambda:UpdateFunctionCode - lambda:TagResource Effect: Allow Resource: - Fn::Join: - "" - - "arn:aws:lambda:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - ":function:" - Ref: lambdamapFunctionName - Fn::Join: - "" - - "arn:aws:lambda:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :function:AfaStack* - Action: - s3:CreateBucket - s3:GetObject* - s3:GetBucketPolicy* - s3:PutObject* - s3:ListBucket - s3:GetBucketLocation - s3:GetEncryptionConfiguration - s3:PutEncryptionConfiguration - s3:PutBucketVersioning - s3:SetBucketEncryption - s3:PutAccountPublicAccessBlock - s3:PutBucketLogging - s3:PutBucketPublicAccessBlock - s3:PutBucketTagging - s3:PutBucketPolicy - s3:PutObjectTagging - s3:DeleteBucketPolicy Condition: ForAllValues:StringEquals: aws:ResourceAccount: Ref: AWS::AccountId aws:SourceAccount: Ref: AWS::AccountId Effect: Allow Resource: - arn:aws:s3:::cdk-* - arn:aws:s3:::cdktoolkit-* - Action: - sagemaker:DescribeNotebookInstanceLifecycleConfig - sagemaker:DeleteNotebookInstance - sagemaker:StopNotebookInstance - sagemaker:DescribeNotebookInstance - sagemaker:CreateNotebookInstanceLifecycleConfig - sagemaker:DeleteNotebookInstanceLifecycleConfig - sagemaker:UpdateNotebookInstanceLifecycleConfig - sagemaker:CreateNotebookInstance - sagemaker:UpdateNotebookInstance - sagemaker:addTags Effect: Allow Resource: - Fn::Join: - "" - - "arn:aws:sagemaker:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :notebook-instance/afastack* - Fn::Join: - "" - - "arn:aws:sagemaker:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :notebook-instance-lifecycle-config/notebooklifecycleconfig* - Action: - ecr:BatchCheckLayerAvailability - ecr:GetDownloadUrlForLayer - ecr:GetRepositoryPolicy - ecr:DescribeRepositories - ecr:ListImages - ecr:DescribeImages - ecr:BatchGetImage - ecr:GetLifecyclePolicy - ecr:GetLifecyclePolicyPreview - ecr:ListTagsForResource - ecr:DescribeImageScanFindings - ecr:InitiateLayerUpload - ecr:UploadLayerPart - ecr:CompleteLayerUpload - ecr:PutImage - ecr:SetRepositoryPolicy - ecr:PutImageScanningConfiguration - ecr:PutImageTagMutability - ecr:DeleteRepository - ecr:TagResource - ecr:UntagResource Effect: Allow Resource: - Fn::Join: - "" - - "arn:aws:ecr:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :repository/cdk-*- - Ref: AWS::AccountId - "-" - Ref: AWS::Region - Fn::Join: - "" - - "arn:aws:ecr:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :repository/aws-cdk/assets - Action: - ecr:GetAuthorizationToken - ecr:CreateRepository Condition: ForAllValues:StringEquals: aws:ResourceAccount: Ref: AWS::AccountId aws:SourceAccount: Ref: AWS::AccountId Effect: Allow Resource: "*" - Action: ec2:DescribeAvailabilityZones Condition: ForAllValues:StringEquals: aws:ResourceAccount: Ref: AWS::AccountId aws:SourceAccount: Ref: AWS::AccountId Effect: Allow Resource: "*" - Action: sts:GetCallerIdentity Condition: ForAllValues:StringEquals: aws:ResourceAccount: Ref: AWS::AccountId aws:SourceAccount: Ref: AWS::AccountId Effect: Allow Resource: "*" - Action: - ssm:GetParameter - ssm:GetParameters - ssm:GetParametersByPath - ssm:PutParameter - ssm:DeleteParameter - ssm:ListTagsForResource - ssm:AddTagsToResource - ssm:RemoveTagsFromResource - ssm:UntagResource Effect: Allow Resource: Fn::Join: - "" - - "arn:aws:ssm:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :parameter/cdk-bootstrap/*/version - Action: - kms:CreateKey - kms:ListAliases - kms:ListKeys Condition: ForAllValues:StringEquals: aws:ResourceAccount: Ref: AWS::AccountId aws:SourceAccount: Ref: AWS::AccountId Effect: Allow Resource: "*" Version: "2012-10-17" PolicyName: LambdaMapCodeBuildPolicyDCA4CAA6 Roles: - Ref: AfaCodeBuildRole2413BF20 Metadata: cfn_nag: rules_to_suppress: - id: W12 reason: Certain actions require '*' resources. DeployStacksProject7C167385: Type: AWS::CodeBuild::Project Properties: Artifacts: Type: NO_ARTIFACTS Environment: ComputeType: BUILD_GENERAL1_SMALL EnvironmentVariables: - Name: BOOTSTRAP_STACK_NAME Type: PLAINTEXT Value: Ref: AWS::StackName - Name: LAMBDAMAP_REPO_URL Type: PLAINTEXT Value: https://github.com/aws-samples/lambdamap.git - Name: LAMBDAMAP_BRANCH Type: PLAINTEXT Value: Ref: lambdamapBranch - Name: LAMBDAMAP_STACK_NAME Type: PLAINTEXT Value: AfaLambdaMapStack - Name: LAMBDAMAP_FUNCTION_NAME Type: PLAINTEXT Value: Ref: lambdamapFunctionName - Name: EMAIL Type: PLAINTEXT Value: Ref: emailAddress - Name: INSTANCE_TYPE Type: PLAINTEXT Value: Ref: instanceType - Name: AFA_STACK_NAME Type: PLAINTEXT Value: AfaStack - Name: AFA_BRANCH Type: PLAINTEXT Value: Ref: afaBranch - Name: AFA_REPO_URL Type: PLAINTEXT Value: https://github.com/aws-samples/simple-forecast-solution.git Image: aws/codebuild/amazonlinux2-x86_64-standard:4.0 ImagePullCredentialsType: CODEBUILD PrivilegedMode: true Type: LINUX_CONTAINER ServiceRole: Fn::GetAtt: - AfaCodeBuildRole2413BF20 - Arn Source: BuildSpec: |- { "version": "0.2", "phases": { "install": { "runtime-versions": { "python": "3.9", "nodejs": "16" }, "commands": [ "export CDK_TAGS=$(aws cloudformation describe-stacks --stack-name=$BOOTSTRAP_STACK_NAME --query Stacks[0].Tags | python -c 'import sys, json; print(\" \".join(\"--tags \" + d[\"Key\"] + \"=\" + d[\"Value\"] for d in json.load(sys.stdin)))')", "export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)", "export BOOTSTRAP_URL=aws://$AWS_ACCOUNT_ID/$AWS_DEFAULT_REGION", "npm i --silent --quiet --no-progress -g aws-cdk@2.45.0", "(( [[ -n \"CDK_TAGS\" ]] ) && ( cdk bootstrap ${BOOTSTRAP_URL} )) || ( cdk bootstrap ${BOOTSTRAP_URL} )" ] }, "build": { "commands": [ "git clone $LAMBDAMAP_REPO_URL", "cd lambdamap/", "git checkout $LAMBDAMAP_BRANCH", "make deploy STACK_NAME=$LAMBDAMAP_STACK_NAME CDK_TAGS=\"$CDK_TAGS\" FUNCTION_NAME=$LAMBDAMAP_FUNCTION_NAME EXTRA_CMDS=\"'git clone ${AFA_REPO_URL} ; cd ./simple-forecast-solution/ ; git checkout ${AFA_BRANCH} ; pip install -q --use-deprecated=legacy-resolver -e .'\"", "cd ..", "git clone $AFA_REPO_URL", "cd simple-forecast-solution/", "git checkout $AFA_BRANCH", "pip install -q -r ./requirements.txt", "make deploy-ui EMAIL=$EMAIL INSTANCE_TYPE=$INSTANCE_TYPE AFA_BRANCH=$AFA_BRANCH LAMBDAMAP_BRANCH=$LAMBDAMAP_BRANCH AFA_STACK_NAME=$AFA_STACK_NAME CDK_TAGS=\"$CDK_TAGS\"" ] } } } Type: NO_SOURCE Cache: Type: NO_CACHE EncryptionKey: alias/aws/s3 Tags: - Key: Project Value: Afa Metadata: aws:cdk:path: AfaBootstrapStack/DeployStacksProject/Resource LambdaRole3A44B857: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: lambda.amazonaws.com Version: "2012-10-17" ManagedPolicyArns: - Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Tags: - Key: Project Value: Afa Metadata: aws:cdk:path: AfaBootstrapStack/LambdaRole/Resource LambdaPolicy7FF67BE6: Type: AWS::IAM::Policy Properties: PolicyDocument: Statement: - Action: codebuild:StartBuild Effect: Allow Resource: Fn::GetAtt: - DeployStacksProject7C167385 - Arn - Action: codebuild:ListProjects Condition: ForAllValues:StringEquals: aws:ResourceAccount: Ref: AWS::AccountId aws:SourceAccount: Ref: AWS::AccountId Effect: Allow Resource: "*" - Action: - lambda:GetFunction - lambda:ListTags - lambda:TagResource - lambda:InvokeFunction Effect: Allow Resource: Fn::Join: - "" - - "arn:aws:lambda:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :function:DeployStacksFunction - Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Effect: Allow Resource: - Fn::Join: - "" - - "arn:aws:logs:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :log-group:/aws/lambda/ - Fn::Join: - "" - - "arn:aws:logs:" - Ref: AWS::Region - ":" - Ref: AWS::AccountId - :log-group:/aws/lambda/ - Ref: AWS::StackName - "*" Version: "2012-10-17" PolicyName: LambdaPolicy7FF67BE6 Roles: - Ref: LambdaRole3A44B857 Metadata: cfn_nag: rules_to_suppress: - id: W12 reason: These actions require '*' resources. DeployStacksFunction96A8E985: Type: AWS::Lambda::Function Properties: Code: ZipFile: | import os import json import boto3 import cfnresponse def lambda_handler(event, context): client = boto3.client("codebuild") client.start_build(projectName=os.environ["PROJECT_NAME"]) cfnresponse.send(event, context, cfnresponse.SUCCESS, {}, "CustomResourcePhysicalID") return Role: Fn::GetAtt: - LambdaRole3A44B857 - Arn Environment: Variables: PROJECT_NAME: Ref: DeployStacksProject7C167385 Handler: index.lambda_handler Runtime: python3.9 Tags: - Key: Project Value: Afa DependsOn: - LambdaRole3A44B857 Metadata: cfn_nag: rules_to_suppress: - id: W89 reason: Function does not access resources in a VPC. - id: W92 reason: Function only runs once during CFN deploys. - id: W58 reason: Function has permissions to write to CW logs. CustomResource: Type: AWS::CloudFormation::CustomResource Properties: ServiceToken: Fn::GetAtt: - DeployStacksFunction96A8E985 - Arn DependsOn: - DeployStacksProject7C167385 UpdateReplacePolicy: Delete DeletionPolicy: Delete Metadata: aws:cdk:path: AfaBootstrapStack/CustomResource/Default CDKMetadata: Type: AWS::CDK::Metadata Properties: Analytics: v2:deflate64:H4sIAAAAAAAA/02NywrCMBBFv6X7dHxUF64LrkP7AZImEadNMpAHUkL+XZsiuLoHzoF7hssVjo14h1aqpTU4QR6jkAvrn44LL6yO2rOvf2QUFvJARm+uLieDcq1ppcIkKT0lNAoy9zRrGavdsTAj7KQE5HtyMiK5Tf64FNanEMkOOlDycr/5456cwloyvsYXuUMHNzh1zRwQW59cRKth2PcDhuUhw9kAAAA= Metadata: aws:cdk:path: AfaBootstrapStack/CDKMetadata/Default Condition: CDKMetadataAvailable Conditions: CDKMetadataAvailable: Fn::Or: - Fn::Or: - Fn::Equals: - Ref: AWS::Region - af-south-1 - Fn::Equals: - Ref: AWS::Region - ap-east-1 - Fn::Equals: - Ref: AWS::Region - ap-northeast-1 - Fn::Equals: - Ref: AWS::Region - ap-northeast-2 - Fn::Equals: - Ref: AWS::Region - ap-south-1 - Fn::Equals: - Ref: AWS::Region - ap-southeast-1 - Fn::Equals: - Ref: AWS::Region - ap-southeast-2 - Fn::Equals: - Ref: AWS::Region - ca-central-1 - Fn::Equals: - Ref: AWS::Region - cn-north-1 - Fn::Equals: - Ref: AWS::Region - cn-northwest-1 - Fn::Or: - Fn::Equals: - Ref: AWS::Region - eu-central-1 - Fn::Equals: - Ref: AWS::Region - eu-north-1 - Fn::Equals: - Ref: AWS::Region - eu-south-1 - Fn::Equals: - Ref: AWS::Region - eu-west-1 - Fn::Equals: - Ref: AWS::Region - eu-west-2 - Fn::Equals: - Ref: AWS::Region - eu-west-3 - Fn::Equals: - Ref: AWS::Region - me-south-1 - Fn::Equals: - Ref: AWS::Region - sa-east-1 - Fn::Equals: - Ref: AWS::Region - us-east-1 - Fn::Equals: - Ref: AWS::Region - us-east-2 - Fn::Or: - Fn::Equals: - Ref: AWS::Region - us-west-1 - Fn::Equals: - Ref: AWS::Region - us-west-2