Использование AWS Lake Formation с CloudFormation

#amazon-web-services #amazon-cloudformation #aws-lake-formation

#amazon-веб-сервисы #amazon-cloudformation #aws-образование озера

Вопрос:

Я хочу настроить дополнительный уровень безопасности поверх моего озера данных S3 / Glue, используя Lake Formation. Я хочу сделать как можно больше с помощью инфраструктуры в виде кода, поэтому, естественно, я изучил документацию по реализации CloudFormation для Lake Formation, которая в настоящее время, честно говоря, очень бесполезна.

У меня есть простой вариант использования: предоставление разрешения администратора одному IAM-пользователю в одном ведре. Может кто-нибудь помочь мне с примером или чем-нибудь подобным?

Комментарии:

1. Нашли ли вы какой-либо шаблон или пример с момента публикации вашего вопроса?

2. Я добавил ответ с моим текущим шаблоном.

Ответ №1:

Вот что я выяснил:

В настоящее время возможно задать местоположение озера данных и предоставить разрешения на доступ к вашим базам данных. К сожалению, похоже CloudFormation , что он пока не поддерживается Data locations . Вам нужно будет предоставить IAM Role доступ к S3 Bucket by вручную в консоли AWS в разделе Lake Formation -> Data locations . Я обновлю ответ, как только CloudFormation появится дополнительная поддержка.

Это шаблон, который мы используем в данный момент:

 DataBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      AccessControl: Private
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      VersioningConfiguration:
        Status: Enabled
      LifecycleConfiguration:
        Rules:
          - Id: InfrequentAccessRule
            Status: Enabled
            Transitions:
              - TransitionInDays: 30
                StorageClass: INTELLIGENT_TIERING

GlueDatabase:
    Type: AWS::Glue::Database
    Properties:
      CatalogId: !Ref AWS::AccountId
      DatabaseInput:
        Name: !FindInMap [Environment, !Ref Environment, GlueDatabaseName]
        Description: !Sub Glue Database ${Environment}

GlueDataAccessRole:
    Type: AWS::IAM::Role
    Properties:
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: ''
            Effect: Allow
            Principal:
              Service: glue.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: AccessDataBucketPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - glue:*
                  - lakeformation:*
                Resource: '*'
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                  - s3:ListBucket
                  - s3:DeleteObject
                Resource:
                  - !Sub ${DataBucket.Arn}
                  - !Sub ${DataBucket.Arn}/*

 DataBucketLakeFormation:
    Type: AWS::LakeFormation::Resource
    Properties:
      ResourceArn: !GetAtt DataBucket.Arn
      UseServiceLinkedRole: true

DataLakeFormationPermission:
    Type: AWS::LakeFormation::Permissions
    Properties:
      DataLakePrincipal:
        DataLakePrincipalIdentifier: !GetAtt GlueDataAccessRole.Arn
      Permissions:
        - ALL
      Resource:
        DatabaseResource:
          Name: !Ref GlueDatabase
        DataLocationResource:
          S3Resource: !Ref DataBucket