Linux

AWS 命令列界面 CLI 設定 S3 ACL 權限控制資料存取教學

介紹如何使用 AWS 命令列界面(awscli)的 s3api 指令設定 S3 bucket 與 object 的 ACL,控制資料存取權限。

列出所有 Buckets

若要列出自己所有的 buckets,可以使用 list-buckets 指令:

# 查詢所有 Buckets
aws --profile=default \
    --endpoint-url=http://s3.example.com \
    s3api list-buckets
{
    "Buckets": [
        {
            "Name": "office",
            "CreationDate": "2019-10-09T09:00:30.373Z"
        },
        {
            "Name": "guide",
            "CreationDate": "2020-06-16T08:59:10.577Z"
        }
    ],
    "Owner": {
        "DisplayName": "Office_Guide",
        "ID": "officeguide"
    }
}

如果只需要列出 buckets 的名稱,可以加上 --query "Buckets[].Name" 參數:

# 查詢所有 Buckets(僅列出名稱)
aws --profile=default \
    --endpoint-url=http://s3.example.com \
    s3api list-buckets \
    --query "Buckets[].Name"
[
    "office",
    "guide"
]

取得 Bucket ACL 設定

若要取得指定 Bucket 目前的 ACL 設定值,可以使用 get-bucket-acl 指令。例如查詢 office 這個 bucket 的 ACL 設定:

# 查詢指定 Bucket ACL 設定值
aws --profile=default \
    --endpoint-url=http://s3.example.com \
    s3api get-bucket-acl \
    --bucket office
{
    "Owner": {
        "DisplayName": "Office_Guide",
        "ID": "officeguide"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "Office_Guide",
                "ID": "officeguide",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

更改 Bucket ACL 設定

若要更新指定 Bucket 的 ACL 設定值,可以使用 put-bucket-acl 指令:

# 更改指定 Bucket ACL 設定值
aws --profile=default \
    --endpoint-url=http://s3.example.com \
    s3api put-bucket-acl \
    --bucket office \
    --grant-full-control id=officeguide \
    --grant-read id=myuser1,id=myuser2

在更改 ACL 的時候,會蓋掉原本的設定,同時需要以 --grant-full-control 授予 bucket 擁有者完整的權限。

在這個例子中,除了設定讓擁有者具有全部的權限之外,同時也使用 --grant-read 授予 myuser1myuser2 兩位使用者讀取權限。

除了上述的兩種權限之外,其餘可用權限還有寫入(--grant-write)、ACL 讀取(--grant-read-acp)與 ACL 寫入(--grant-write-acp),詳細的用法可參考 AWS 的說明文件

如果想以 JSON 格式來輸入設定值,可以先以 --generate-cli-skeleton 產生 JSON 格式的範例:

# 產生 JSON 輸入格式範例
aws s3api put-bucket-acl --generate-cli-skeleton
{
    "ACL": "public-read",
    "AccessControlPolicy": {
        "Grants": [
            {
                "Grantee": {
                    "DisplayName": "",
                    "EmailAddress": "",
                    "ID": "",
                    "Type": "CanonicalUser",
                    "URI": ""
                },
                "Permission": "WRITE"
            }
        ],
        "Owner": {
            "DisplayName": "",
            "ID": ""
        }
    },
    "Bucket": "",
    "ContentMD5": "",
    "GrantFullControl": "",
    "GrantRead": "",
    "GrantReadACP": "",
    "GrantWrite": "",
    "GrantWriteACP": ""
}

依照此格式將輸入的 JSON 檔案準備好之後,即可使用 JSON 輸入檔的方式來修改 bucket 的 ACL 設定:

# 以 JSON 輸入方式更改指定 Bucket ACL 設定值
aws --profile=default \
    --endpoint-url=http://s3.example.com \
    s3api put-bucket-acl \
    --cli-input-json input.json

取得 Object ACL 設定

若要取得指定 Object 目前的 ACL 設定值,可以使用 get-object-acl 指令:

# 查詢指定 Object ACL 設定值
aws --profile=default \
    --endpoint-url=http://s3.example.com \
    s3api get-bucket-acl \
    --bucket office \
    --key my_file.txt
{
    "Owner": {
        "DisplayName": "Office_Guide",
        "ID": "officeguide"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "Office_Guide",
                "ID": "officeguide",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

更改 Object ACL 設定

若要更新指定 Object 的 ACL 設定值,可以使用 put-object-acl 指令:

# 更改指定 Object ACL 設定值
aws --profile=default \
    --endpoint-url=http://s3.example.com \
    s3api put-object-acl \
    --bucket office \
    --key my_file.txt \
    --grant-full-control id=officeguide \
    --grant-read id=myuser1,id=myuser2

這裡的授權設定方式跟 bucket 非常類似,亦可使用 JSON 的方式來輸入設定值。

參考資料:G. T. Wang

Share
Published by
Office Guide
Tags: Amazon S3

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago