AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  VpcCIDRBlock:
    Type: String
    Default: "10.0.0.0/16"
    Description: "CIDR block for the VPC"
  PublicSubnetCIDRBlock:
    Type: String
    Default: "10.0.0.0/24"
    Description: "CIDR block for the public subnet"
  PrivateSubnetCIDRBlock:
    Type: String
    Default: "10.0.1.0/24"
    Description: "CIDR block for the private subnet"
  AvailabiltyZone:
    Type: String
    Default: "us-east-1a"
    Description: "Availability Zone to Use"
  S3SourceBucket:
    Type: String
    Default: "athena-multicloud-blog-aws"
    Description: "Name of the S3 bucket to store data file for AWS Cloud"
  AthenaLocationAzure:
    Type: String
    Default: "athena-multicloud-blog-azure"
    Description: "Name of the S3 bucket to store Athena query results/ spill files for Azure Workgroup"
  AthenaLocationGCP:
    Type: String
    Default: "athena-multicloud-blog-gcp"
    Description: "Name of the S3 bucket to store Athena query results/ spill files for GCP Workgroup"
  AthenaLocationMulti:
    Type: String
    Default: "athena-multicloud-blog-hybrid"
    Description: "Name of the S3 bucket to store Athena query results/ spill files for Multi Workgroup"
  AzureSynapseURL:
    Type: String
    Description: "Azure Synapse jdbc url. Example: jdbc:sqlserver://xxxx-ondemand.sql.azuresynapse.net;databaseName=azure_athena_blog_db"
  AzureSynapseUserName:
    Type: String
    Description: "Username for Azure Synapse Database"
  AzureSynapsePwd:
    Type: String
    NoEcho: true
    Description: "Password for Azure Synapse Database"
  AzureSecretName:
    Type: String
    Default: "BlogAthenaMC-AzureSynapseSecret"
    Description: "Name for the Secrets Manager secret used to store the Azure credentials (username and pwd)"
  GCSSecretName:
    Type: String
    Default: "BlogAthenaMC-GCPGCSSecret"
    Description: "Name for the Secrets Manager secret used to store the GCP Service Account credentials for GCS"
  GCSSecretKey:
    Type: String
    NoEcho: true
    Description: "Content from the secret key from GCP."

  GCSBucketName:
    Type: String
    Default: "athena-mc-blog"
    Description: "Name of teh bucket on GCS where data files are stored."


  GCSLambdaFunctionName:
    Type: String
    Default: "gcs_lambda_fn"
    Description: "Lambda function name which will be created and used for GCS queries."

  AzureADLSLambdaFunctionName:
    Type: String
    Default: "azure_lambda_fn"
    Description: "Lambda function name which will be created and used for Azure ADLS queries."

  UserAzureADLSAndS3UserPassword:
    Type: String
    NoEcho: true
    Description: AWS Console password to be used by User1 who can  access Azure ADLS from Athena and S3 data. Minimum of 8 characters
  UserGCSAndS3UserPassword:
    Type: String
    NoEcho: true
    Description: Password to be used by User2 who can  access GCP GCS from Athena and S3 data. Minimum of 8 characters
  UserMultiCloudUserPassword:
    Type: String
    NoEcho: true
    Description: Password to be used by User3 who can access data from all cloud stores and run multi cloud queries on Athena. Minimum of 8 characters

  AthenaFederatedDataSourceNameAzure:
    Type: String
    Default: "azure_adls_ds"
    Description: "Athena Datasource name that you will use to access the Azure ADLS data ."

  AthenaFederatedDataSourceNameGCS:
    Type: String
    Default: "gcp_gcs_ds"
    Description: "Athena Datasource name that you will use to access the GCP GCS data ."


Resources:
  AthenaMultiCloudBlogVPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: !Ref VpcCIDRBlock
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: "Athena-Multicloud-Blog-VPC"

  AthenaMultiCloudBlogVPCNoIngressSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "no-ingress-sg"
      GroupDescription: "Security group with no ingress rule"
      VpcId: !Ref AthenaMultiCloudBlogVPC

  PublicSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref AthenaMultiCloudBlogVPC
      CidrBlock: !Ref PublicSubnetCIDRBlock
      AvailabilityZone: !Ref AvailabiltyZone 
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: "PublicSubnet"

  PrivateSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref AthenaMultiCloudBlogVPC
      CidrBlock: !Ref PrivateSubnetCIDRBlock
      AvailabilityZone: !Ref AvailabiltyZone 
      Tags:
        - Key: Name
          Value: "athena-multicloud-privatesubnet"

  InternetGateway:
    Type: "AWS::EC2::InternetGateway"
    Properties:
      Tags:
        - Key: Name
          Value: "athena-multicloud-InternetGateway"

  AttachGateway:
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties:
      VpcId: !Ref AthenaMultiCloudBlogVPC
      InternetGatewayId: !Ref InternetGateway

  NatGateway:
    Type: "AWS::EC2::NatGateway"
    Properties:
      AllocationId: !GetAtt ElasticIP.AllocationId
      SubnetId: !Ref PublicSubnet

  ElasticIP:
    Type: "AWS::EC2::EIP"

  PublicRouteTable:
    Type: "AWS::EC2::RouteTable"
    Properties:
      VpcId: !Ref AthenaMultiCloudBlogVPC
      Tags:
        - Key: Name
          Value: "PublicRouteTable"

  PublicRoute:
    Type: "AWS::EC2::Route"
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable

  PrivateRouteTable:
    Type: "AWS::EC2::RouteTable"
    Properties:
      VpcId: !Ref AthenaMultiCloudBlogVPC
      Tags:
        - Key: Name
          Value: "PrivateRouteTable"

  PrivateRoute:
    Type: "AWS::EC2::Route"
    DependsOn: NatGateway
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      DestinationCidrBlock: "0.0.0.0/0"
      NatGatewayId: !Ref NatGateway

  SubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref PrivateSubnet
      RouteTableId: !Ref PrivateRouteTable

  S3BucketAthenaLocationAzure:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref AthenaLocationAzure
      Tags:
        - Key: "athena-mc-analytics:s3:result-spill"
          Value: "azure"
  
  S3BucketAthenaLocationGCP:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref AthenaLocationGCP
      Tags:
        - Key: "athena-mc-analytics:s3:result-spill"
          Value: "gcp"

  S3BucketAthenaLocationMulti:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref AthenaLocationMulti
      Tags:
        - Key: "athena-mc-analytics:s3:result-spill"
          Value: "hybrid"

  S3BucketSourceData:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref S3SourceBucket
      Tags:
        - Key: "athena-mc-analytics:s3:source"
          Value: "aws"

  ## Athena Workgroups
  AthenaWorkgroupAzure:
    Type: 'AWS::Athena::WorkGroup'
    Properties:
      Name: 'athena-mc-analytics-azure-wg'
      Description: 'Athena Workgroup for Azure Queries'
      State: ENABLED
      RecursiveDeleteOption: true
      WorkGroupConfiguration:
        ResultConfiguration:
          OutputLocation: !Sub 's3://${S3BucketAthenaLocationAzure}/athena-results' 
      Tags:
        - Key: "athena-mc-analytics:athena:workgroup"
          Value: "azure"

  ## Athena Workgroup
  AthenaWorkgroupGCP:
    Type: 'AWS::Athena::WorkGroup'
    Properties:
      Name: 'athena-mc-analytics-gcp-wg'
      Description: 'Athena Workgroup for GCP Queries'
      State: ENABLED
      RecursiveDeleteOption: true
      WorkGroupConfiguration:
        ResultConfiguration:
          OutputLocation: !Sub 's3://${S3BucketAthenaLocationGCP}/athena-results'
      Tags:
        - Key: "athena-mc-analytics:athena:workgroup"
          Value: "gcp"

  ## Athena Workgroup
  AthenaWorkgroupMulti:
    Type: 'AWS::Athena::WorkGroup'
    Properties:
      Name: 'athena-mc-analytics-multi-wg'
      Description: 'Athena Workgroup for Hybrid Queries'
      State: ENABLED
      RecursiveDeleteOption: true
      WorkGroupConfiguration:
        ResultConfiguration:
          OutputLocation: !Sub 's3://${S3BucketAthenaLocationMulti}/athena-results'
      Tags:
        - Key: "athena-mc-analytics:athena:workgroup"
          Value: "multi"

  ## Secrets 
  AzureSynapseCreds:
    Type: "AWS::SecretsManager::Secret"
    Properties:
      Name: !Ref AzureSecretName
      Description: "Azure Synapse Credentials"
      SecretString: !Sub '{"username":"${AzureSynapseUserName}", "password":"${AzureSynapsePwd}"}'
      Tags:
        - Key: "athena-mc-analytics:secretsmanager:secret"
          Value: "azure"

  GCPCreds:
    Type: "AWS::SecretsManager::Secret"
    Properties:
      Name: !Ref GCSSecretName
      Description: "Azure Synapse Credentials"
      SecretString: !Ref GCSSecretKey
      Tags:
        - Key: "athena-mc-analytics:secretsmanager:secret"
          Value: "gcp"

  ##GLue Database for GCS queries
  GlueDatabaseGCS:
    Type: 'AWS::Glue::Database'
    Properties:
      DatabaseInput:
        Name: 'oktank_multicloudanalytics_gcp'
        LocationUri: 's3://google-cloud-storage-flag'
      CatalogId: !Sub ${AWS::AccountId}
  ## Customer Table for GCS Database
  GlueTableCustomerGCS:
    Type: 'AWS::Glue::Table'
    DependsOn: GlueDatabaseGCS
    Properties:
      CatalogId: !Sub ${AWS::AccountId}
      DatabaseName: 'oktank_multicloudanalytics_gcp'
      TableInput:
        Name: 'customer_feedbacks'
        Description: 'Your table description (optional)'
        Parameters: {
                "classification": "csv",
                "skip.header.line.count": "1"
        }
        StorageDescriptor:
          Columns:
            - Name: data_key
              Type: bigint
            - Name: data_load_date
              Type: string
            - Name: data_location
              Type: string
            - Name: customer_email
              Type: string
            - Name: customer_name
              Type: string
            - Name: comment1
              Type: string
            - Name: comment2
              Type: string
            # Add more columns as needed
          Location: !Sub 'gs://${GCSBucketName}/'
          InputFormat: 'org.apache.hadoop.mapred.TextInputFormat'
          OutputFormat: 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
          SerdeInfo:
            SerializationLibrary: 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
            Parameters:
              'field.delim': ','   
  GlueDatabaseAWS:
    Type: 'AWS::Glue::Database'
    Properties:
      DatabaseInput:
        Name: 'oktank_multicloudanalytics_aws'
      CatalogId: !Sub ${AWS::AccountId}
  ## Customer Table for GCS Database
  GlueTableCustomerAWS:
    Type: 'AWS::Glue::Table'
    DependsOn: GlueDatabaseAWS
    Properties:
      CatalogId: !Sub ${AWS::AccountId}
      DatabaseName: 'oktank_multicloudanalytics_aws'
      TableInput:
        Name: 'customer_feedbacks'
        Description: 'Your table description (optional)'
        Parameters:
          'skip.header.line.count': '1' 
        StorageDescriptor:
          Columns:
            - Name: data_key
              Type: bigint
            - Name: data_load_date
              Type: string
            - Name: data_location
              Type: string
            - Name: customer_email
              Type: string
            - Name: customer_name
              Type: string
            - Name: comment1
              Type: string
            - Name: comment2
              Type: string
            # Add more columns as needed
          Location: !Sub 's3://${S3SourceBucket}/'
          InputFormat: 'org.apache.hadoop.mapred.TextInputFormat'
          OutputFormat: 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
          SerdeInfo:
            SerializationLibrary: 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
            Parameters:
              'field.delim': ',' 

  #Users
  DLAzureADLSUser:
    Type: AWS::IAM::User
    Properties:
      LoginProfile:
        Password: !Ref UserAzureADLSAndS3UserPassword
        PasswordResetRequired: False
      Policies:
        - PolicyName: DLUser1Policy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: ['athena:GetWorkGroup','athena:StartQueryExecution','athena:GetQueryExecution','athena:GetQueryResults']
                Resource: !Sub 'arn:aws:athena:*:${AWS::AccountId}:workgroup/athena-mc-analytics-azure-wg'
              - Effect: Allow
                Action: ['athena:ListWorkGroups','athena:ListDataCatalogs']
                Resource: '*'
              - Effect: Allow
                Action: ['athena:ListDatabases','athena:GetDatabase','athena:GetDataCatalog','athena:GetTableMetadata','athena:ListTableMetadata']
                Resource: !Sub 'arn:aws:athena:*:${AWS::AccountId}:datacatalog/${AthenaFederatedDataSourceNameAzure}'
              - Effect: Allow
                Action: ['lambda:InvokeFunction']
                Resource: !Sub 'arn:aws:lambda:*:${AWS::AccountId}:function:${AzureADLSLambdaFunctionName}'

        - PolicyName: AthenaResultLocationPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetBucketLocation
                  - s3:ListBucket
                Resource: !Sub 'arn:aws:s3:::${AthenaLocationAzure}'
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                Resource: !Sub 'arn:aws:s3:::${AthenaLocationAzure}/athena-results/*'

        - PolicyName: S3DataAccessPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetBucketLocation
                  - s3:ListBucket
                Resource: !Sub 'arn:aws:s3:::${S3SourceBucket}'
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                Resource: !Sub 'arn:aws:s3:::${S3SourceBucket}/*'

        - PolicyName: GluePermsADLS
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: ['glue:GetTable','glue:GetTables','glue:GetDatabase','glue:GetDatabases']
                Resource: 
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:catalog'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:database/oktank_multicloudanalytics_aws'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:table/oktank_multicloudanalytics_aws/*'
        
  DLGCPGCSUser:
    Type: AWS::IAM::User
    Properties:
      LoginProfile:
        Password: !Ref UserGCSAndS3UserPassword
        PasswordResetRequired: False
      Policies:
        - PolicyName: DLUser2Policy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: ['athena:GetWorkGroup','athena:StartQueryExecution','athena:GetQueryExecution','athena:GetQueryResults']
                Resource: !Sub 'arn:aws:athena:*:${AWS::AccountId}:workgroup/athena-mc-analytics-gcp-wg'
              - Effect: Allow
                Action: ['athena:ListWorkGroups','athena:ListDataCatalogs']
                Resource: '*'
              - Effect: Allow
                Action: ['athena:ListDatabases','athena:GetDatabase','athena:GetDataCatalog','athena:GetTableMetadata','athena:ListTableMetadata']
                Resource: !Sub 'arn:aws:athena:*:${AWS::AccountId}:datacatalog/${AthenaFederatedDataSourceNameGCS}'
              - Effect: Allow
                Action: ['lambda:InvokeFunction']
                Resource: !Sub 'arn:aws:lambda:*:${AWS::AccountId}:function:${GCSLambdaFunctionName}'
        - PolicyName: AthenaResultLocationPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetBucketLocation
                  - s3:ListBucket
                Resource: !Sub 'arn:aws:s3:::${AthenaLocationGCP}'
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                Resource: !Sub 'arn:aws:s3:::${AthenaLocationGCP}/athena-results/*'
        - PolicyName: S3DataAccessPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetBucketLocation
                  - s3:ListBucket
                Resource: !Sub 'arn:aws:s3:::${S3SourceBucket}'
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                Resource: !Sub 'arn:aws:s3:::${S3SourceBucket}/*'
        - PolicyName: GluePermsGCS
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: ['glue:GetTable','glue:GetTables','glue:GetDatabase','glue:GetDatabases']
                Resource: 
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:catalog'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:database/oktank_multicloudanalytics_gcp'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:table/oktank_multicloudanalytics_gcp/*'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:database/oktank_multicloudanalytics_aws'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:table/oktank_multicloudanalytics_aws/*'
  DLMultiUser:
    Type: AWS::IAM::User
    Properties:
      LoginProfile:
        Password: !Ref UserMultiCloudUserPassword
        PasswordResetRequired: False
      Policies:
        - PolicyName: DLUser3Policy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: ['athena:GetWorkGroup','athena:StartQueryExecution','athena:GetQueryExecution','athena:GetQueryResults']
                Resource: !Sub 'arn:aws:athena:*:${AWS::AccountId}:workgroup/athena-mc-analytics-multi-wg'
              - Effect: Allow
                Action: ['athena:ListWorkGroups']
                Resource: '*'
              - Effect: Allow
                Action: ['athena:ListWorkGroups','athena:ListDataCatalogs']
                Resource: '*'
              - Effect: Allow
                Action: ['athena:ListDatabases','athena:GetDatabase','athena:GetDataCatalog','athena:GetTableMetadata','athena:ListTableMetadata']
                Resource: 
                  - !Sub 'arn:aws:athena:*:${AWS::AccountId}:datacatalog/${AthenaFederatedDataSourceNameGCS}'
                  - !Sub 'arn:aws:athena:*:${AWS::AccountId}:datacatalog/${AthenaFederatedDataSourceNameAzure}'
              - Effect: Allow
                Action: ['lambda:InvokeFunction']
                Resource: 
                  - !Sub 'arn:aws:lambda:*:${AWS::AccountId}:function:${GCSLambdaFunctionName}'
                  - !Sub 'arn:aws:lambda:*:${AWS::AccountId}:function:${AzureADLSLambdaFunctionName}'
        - PolicyName: AthenaResultLocationPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetBucketLocation
                  - s3:ListBucket
                Resource: !Sub 'arn:aws:s3:::${AthenaLocationMulti}'
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                Resource: !Sub 'arn:aws:s3:::${AthenaLocationMulti}/athena-results/*'
        - PolicyName: S3DataAccessPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetBucketLocation
                  - s3:ListBucket
                Resource: !Sub 'arn:aws:s3:::${S3SourceBucket}'
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                Resource: !Sub 'arn:aws:s3:::${S3SourceBucket}/*'
        - PolicyName: GluePermsMulti
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: ['glue:GetTable','glue:GetTables','glue:GetDatabase','glue:GetDatabases']
                Resource: 
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:catalog'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:database/oktank_multicloudanalytics_gcp'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:table/oktank_multicloudanalytics_gcp/*'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:database/oktank_multicloudanalytics_aws'
                  - !Sub 'arn:aws:glue:*:${AWS::AccountId}:table/oktank_multicloudanalytics_aws/*'

Outputs:
  VPCId:
    Description: "VPC Id"
    Value: !Ref AthenaMultiCloudBlogVPC
  PrivateSubnetId:
    Description: "Private Subnet Id"
    Value: !Ref PrivateSubnet
  SecurityGroupId:
    Description: "Private Subnet Id"
    Value: !Ref AthenaMultiCloudBlogVPCNoIngressSecurityGroup
  AzureS3Bucket:
    Description: "S3 Bucket for Athena to store Azure query results and  spills "
    Value: !Ref S3BucketAthenaLocationAzure
  AzureSynapseConnectorJDBCURL:
    Description: "Connection string to be provided in Azure Connector Serverless Application"
    Value: 
      Fn::Join:
          - ''
          - - 'synapse://'
            - !Ref AzureSynapseURL
            - ';${'
            - !Ref AzureSecretName
            - '}'
  AzureSecretName:
    Description: "AWS Secret Name which stores Azure Synapse Credentials"
    Value: !Ref AzureSecretName
  GCSSecretName:
    Description: "AWS Secret Name which stores GCS Credentials"
    Value: !Ref GCSSecretName
  GCPS3Bucket:
    Description: "S3 Bucket for Athena to store GCP query results and  spills "
    Value: !Ref S3BucketAthenaLocationGCP
  GCSLambdaFunctionName:
    Description: "Lambda function name for GCS Connector"
    Value: !Ref GCSLambdaFunctionName
  AzureADLSLambdaFunctionName:
    Description: "Lambda function name for Azure Connector"
    Value: !Ref AzureADLSLambdaFunctionName
  S3SourceBucket:
    Value: !Ref S3SourceBucket
    Description: "Name of the S3 bucket to store data file for AWS Cloud"
  AthenaLocationAzure:
    Value: !Ref AthenaLocationAzure
    Description: "Name of the S3 bucket to store Athena query results/ spill files for Azure Workgroup"
  AthenaLocationGCP:
    Value: !Ref AthenaLocationGCP
    Description: "Name of the S3 bucket to store Athena query results/ spill files for GCP Workgroup"
  AthenaLocationHybrid:
    Value: !Ref AthenaLocationMulti
    Description: "Name of the S3 bucket to store Athena query results/ spill files for Hybrid Workgroup"
  UserAzureADLSUser:
    Value: !Ref DLAzureADLSUser
    Description: "User who can AndS3 access Azure ADLS from Athena. "
  UserGCPGCSUser:
    Value: !Ref DLGCPGCSUser
    Description: "User who can AndS3 access GCP GCS from Athena. "
  UserMultiCloudUser:
    Value: !Ref DLMultiUser
    Description: "User who can access data from all cloud stores and run multi cloud queries on Athena." 
  AthenaFederatedDataSourceNameForAzure:
    Value: !Ref AthenaFederatedDataSourceNameAzure
    Description: "Athena Datasource name that you will use to access the Azure ADLS data .."
  AthenaFederatedDataSourceNameForGCS:
    Value: !Ref AthenaFederatedDataSourceNameGCS
    Description: "Athena Datasource name that you will use to access the GCP GCS data ."


