Используйте Cloudformation для включения инвентаризации S3 - PullRequest
1 голос
/ 10 марта 2020

Я могу включить инвентарь, используя консоль, как показано на этом изображении. Есть ли способ сделать то же самое, используя boto?

enter image description here


Обновление:

Вот полный скрипт, который работает !

import boto3

s3_client = boto3.client(
    "s3",
    aws_access_key_id="XXX",
    aws_secret_access_key="XXX",
    region_name="us-east-1",
)

response = s3_client.put_bucket_inventory_configuration(
    Bucket="athenadata16",
    Id="myinventory",
    InventoryConfiguration={
        "Destination": {
            "S3BucketDestination": {
                "AccountId": "1234567890",
                "Bucket": "arn:aws:s3:::athenadata16",
                "Format": "ORC",
                "Prefix": "mypre",
            }
        },
        "IsEnabled": True,
        "Filter": {"Prefix": "myprefilter"},
        "Id": "myinventory",
        "IncludedObjectVersions": "Current",
        "OptionalFields": [
            "Size",
            "LastModifiedDate",
            "StorageClass",
            "ETag",
            "IsMultipartUploaded",
            "ReplicationStatus",
            "EncryptionStatus",
            "ObjectLockRetainUntilDate",
            "ObjectLockMode",
            "ObjectLockLegalHoldStatus",
            "IntelligentTieringAccessTier",
        ],
        "Schedule": {"Frequency": "Daily"},
    },
)

В соответствии с документами можно добавить инвентарь с использованием облачной информации.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html

Может кто-нибудь предоставить пример?


Обновление 2:

После выполнения следующего шаблона было создано новое ведро с именем "athenadata162a-bucketwithinventory-1snf1yx82si5 c". Это было ожидаемо. Область назначения инвентаря указывает на "athenadata162" из-за настройки BucketArn. Мне нужно указать его текущее название корзины. Является ли это возможным?

Resources:
    BucketWithInventory: 
      Type: "AWS::S3::Bucket"
      Properties: 
        InventoryConfigurations: 
          - 
            Destination: 
              BucketAccountId: !Sub '${AWS::AccountId}'
              BucketArn: !Sub 'arn:aws:s3:::athenadata16'
              Format: CSV
              Prefix: mypre
            Enabled: true
            Id: myinventory
            IncludedObjectVersions: Current
            OptionalFields: 
              - Size
              - LastModifiedDate
              - StorageClass
              - ETag
              - IsMultipartUploaded
              - ReplicationStatus
              - ObjectLockRetainUntilDate
              - ObjectLockMode
              - ObjectLockLegalHoldStatus
              - IntelligentTieringAccessTier
            Prefix: myprefilter
            ScheduleFrequency: Daily

Если изменить его на это, я получу ошибку циклической ссылки.

BucketArn:! Sub 'arn: aws: s3 ::: $ {BucketWithInventory} '


Благодаря ответу franklinsijo, вот полный код для создания корзины с инвентарем, которая сохранит CSV-файл в том же контейнере.

Resources:
    BucketWithInventory: 
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: !Sub 'athenadata162-${AWS::AccountId}'
        InventoryConfigurations: 
          - 
            Destination: 
              BucketAccountId: !Sub '${AWS::AccountId}'
              BucketArn: !Sub 'arn:aws:s3:::athenadata162-${AWS::AccountId}'
              Format: CSV
              Prefix: mypre
            Enabled: true
            Id: myinventory
            IncludedObjectVersions: Current
            OptionalFields: 
              - Size
              - LastModifiedDate
              - StorageClass
              - ETag
              - IsMultipartUploaded
              - ReplicationStatus
              - ObjectLockRetainUntilDate
              - ObjectLockMode
              - ObjectLockLegalHoldStatus
              - IntelligentTieringAccessTier
            Prefix: myprefilter
            ScheduleFrequency: Daily

Обновление 4:

Когда я вручную добавляю конфигурацию инвентаря, автоматически добавляется следующая политика корзины. Упомянутый выше шаблон облачной информации не включает этот шаг и, следовательно, получает ошибку «отказано в доступе». Как включить это в этот шаблон?

{
    "Id": "S3-Console-Auto-Gen-Policy-1585038423058",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3PolicyStmt-DO-NOT-MODIFY-1585038422770",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::athenadata162-1234567890/*"
            ],
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": [
                        "arn:aws:s3:::athenadata162-1234567890"
                    ]
                },
                "StringEquals": {
                    "aws:SourceAccount": [
                        "1234567890"
                    ],
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

Обновление 5

Окончательная версия шаблона будет выглядеть примерно так ...

Resources:
    BucketWithInventory: 
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: !Sub '${AWS::StackName}-${AWS::AccountId}'
        InventoryConfigurations: 
          - 
            Destination: 
              BucketAccountId: !Sub '${AWS::AccountId}'
              BucketArn: !Sub 'arn:aws:s3:::${AWS::StackName}-${AWS::AccountId}'
              Format: CSV
              Prefix: mypre
            Enabled: true
            Id: myinventory
            IncludedObjectVersions: Current
            OptionalFields: 
              - Size
              - LastModifiedDate
              - StorageClass
              - ETag
              - IsMultipartUploaded
              - ReplicationStatus
              - ObjectLockRetainUntilDate
              - ObjectLockMode
              - ObjectLockLegalHoldStatus
              - IntelligentTieringAccessTier
            Prefix: myprefilter
            ScheduleFrequency: Daily

    BucketPolicyForInventoryBucket:
       Type: AWS::S3::BucketPolicy 
       Properties: 
         Bucket: !Ref BucketWithInventory
         PolicyDocument: 
            Statement:
            - 
                Effect: Allow
                Principal:
                    Service: s3.amazonaws.com
                Action:
                - s3:PutObject
                Resource:
                - !Join ["", ["arn:aws:s3:::", !Ref BucketWithInventory, "/*"]]
                Condition:
                    ArnLike:
                        aws:SourceArn:
                        - !Join ["", ["arn:aws:s3:::", !Ref BucketWithInventory, "/*"]]
                    StringEquals:
                        aws:SourceAccount:
                        - !Sub '${AWS::AccountId}'
                        s3:x-amz-acl: bucket-owner-full-control 

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

В справочнике Boto3 перечислено несколько методов для работы с конфигурациями инвентаря, в частности это:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3 .Client.put_bucket_inventory_configuration

Если вы когда-нибудь спросите себя "может ли это сделать boto3?", go до boto3 do c, найдите соответствующую справочную службу (https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html) и выполните быстрое нажатие клавиш Ctrl + F на этой странице. Скорее всего, boto3 действительно может сделать это.

1 голос
/ 20 марта 2020

Ресурс облачной информации для помещения конфигураций инвентаризации в корзину S3, аналогичную конфигурациям, представленным во фрагменте boto3,

BucketWithInventory: 
  Type: "AWS::S3::Bucket"
  Properties: 
    BucketName: athenadata16
    InventoryConfigurations: 
      - 
        Destination: 
          BucketAccountId: 1234567890
          BucketArn: "arn:aws:s3:::athenadata16"
          Format: CSV
          Prefix: mypre
        Enabled: true
        Id: myinventory
        IncludedObjectVersions: Current
        OptionalFields: 
          - Size
          - LastModifiedDate
          - StorageClass
          - ETag
          - IsMultipartUploaded
          - ReplicationStatus
          - ObjectLockRetainUntilDate
          - ObjectLockMode
          - ObjectLockLegalHoldStatus
          - IntelligentTieringAccessTier
        Prefix: myprefilter
        ScheduleFrequency: Daily
BucketPolicyForInventoryBucket:
   Type: AWS::S3::BucketPolicy 
   Properties: 
     Bucket: !Ref BucketWithInventory
     PolicyDocument: 
        Statement:
        - 
            Effect: Allow
            Principal:
                Service: s3.amazonaws.com
            Action:
            - s3:PutObject
            Resource:
            - !Join ["", ["arn:aws:s3:::", !Ref BucketWithInventory, "/*"]]
            Condition:
                ArnLike:
                    aws:SourceArn:
                    - !Join ["", ["arn:aws:s3:::", !Ref BucketWithInventory, "/*"]]
                StringEquals:
                    aws:SourceAccount:
                    - '1234567890'
                    s3:x-amz-acl: bucket-owner-full-control 

Согласно документации облачной информации , кажется, что поддерживается только один поддерживаемый формат файла быть CSV.

...