2016-03-16 1 views
3

У меня есть ответ от АМС, как этотУдалить AllUsers из политики ACL в Баш

{ 
    "Owner": { 
    "DisplayName": "2414218.aws", 
    "ID": "xxxxxxxx" 
    }, 
    "Grants": [ 
    { 
     "Grantee": { 
     "DisplayName": "2414218.aws", 
     "ID": "yyyyyyyyyy" 
     }, 
     "Permission": "FULL_CONTROL" 
    }, 
    { 
     "Grantee": { 
     "URI": "http://acs.amazonaws.com/groups/global/AllUsers" 
     }, 
     "Permission": "READ" 
    } 
    ] 
} 

Я ищу, чтобы обновить файлы, так AllUsers удаляется (получить объектно-ACL должен выглядеть ниже)

{ 
    "Owner": { 
    "DisplayName": "2414218.aws", 
    "ID": "xxxxxxxx" 
    }, 
    "Grants": [ 
    { 
     "Grantee": { 
     "DisplayName": "2414218.aws", 
     "ID": "yyyyyyyyyy" 
     }, 
     "Permission": "FULL_CONTROL" 
    } 
    ] 
} 

Как я могу это сделать, не зная, какие другие грантополучатели доступны? Я специально искал, чтобы удалить грантополучателя, когда я вижу http://acs.amazonaws.com/groups/global/AllUsers

настоящее время я использую aws s3api get-object-acl --bucket mhe-deployments-prod --key $keyFile | jq '.' найти политику

ответ

3

Вот это JQ фильтр, который будут удалены все элементы массива .Grants, для которых .Grantee.URI является "http://acs.amazonaws.com/groups/global/AllUsers":

.Grants |= map(select(.Grantee.URI != "http://acs.amazonaws.com/groups/global/AllUsers")) 

Out положить: по запросу

0

Вероятно, не лучший, но это работало

#!/usr/local/bin/bash 
# aws ~/.aws/credentials and s3cmd must be configured first with proper creds 

target='' 
for key in $(aws s3 ls s3://$target --recursive |awk '{print$4}') ; do 
    [ "${key: -1}" == "/" ] || { 
    award=$(aws s3api get-object-acl --bucket $target --key $key |jq '.Grants[].Grantee | .URI' |grep -v 'null' |grep AllUsers) 

    [ ! -z "${award}" ] && { 
     policy=$(aws s3api get-object-acl --bucket $target --key $key) 
     echo "$target: $key\n$policy\n\n" >> /tmp/policy-backup.json 
     echo -e "Working on: $key" 

     s3cmd setacl s3://$target/$key --acl-private ## s3cmd must be comfigured to your env 
    } 
    } 
done 
2

Вы можете использовать встроенную опцию --query в AWS CLI. Выгода быть вам не нужны никакие внешние инструменты:

aws s3api get-object-acl --bucket $BUCKET --key $KEY \ 
    --query "{Owner: Owners, \ 
      Grants: Grants[?Grantee.URI != 'http://acs.amazonaws.com/groups/global/AllUsers']}" 
+0

Приятный, это было в значительной степени тем, что я искал – ehime

0

В этой задаче указано грант также могут быть удалены непосредственно с del. например

del(
    .Grants[] 
    | select(.Grantee.URI == "http://acs.amazonaws.com/groups/global/AllUsers") 
)