Я могу включить инвентарь, используя консоль, как показано на этом изображении. Есть ли способ сделать то же самое, используя boto?
Обновление:
Вот полный скрипт, который работает !
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