【AWS CLI】CLIでS3のコンテンツを公開する方法

CLIでS3のコンテンツを公開する方法

S3に静的コンテンツを配置して公開する際に、S3へのアップロードはsyncコマンドなどで自動実行できますが、公開をいちいち管理画面にログインして「公開する」ボタンを押しているので非常に非効率です。この悩みを解決すべく、AWS CLIにて管理画面での「公開する」ボタンと同じ操作ができないか調べました。

使いそうなコマンドを調べる

bucketのACLを確認するコマンド

$ aws s3api get-bucket-acl --bucket [bucket name]
{
    "Owner": {
        "DisplayName": "***********",
        "ID": "212020e7bd02e8b1fd6d1df75f7a838f335ad9e8dfe0bb05806cc3ca01967b7d"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "***********",
                "ID": "212020e7bd02e8b1fd6d1df75f7a838f335ad9e8dfe0bb05806cc3ca01967b7d",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}
bucketのACLを確認するだけでS3のコンテンツをpublic-readに変更するわけではないので、確認用に使います。

bucketのACLを確認するコマンドの--keyオプション

$ aws s3api get-object-acl --bucket [bucket name] --key static/index.html
{
    "Owner": {
        "DisplayName": "***********",
        "ID": "212020e7bd02e8b1fd6d1df75f7a838f335ad9e8dfe0bb05806cc3ca01967b7d"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "***********",
                "ID": "212020e7bd02e8b1fd6d1df75f7a838f335ad9e8dfe0bb05806cc3ca01967b7d",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}
bucket内のkeyで指定したファイルのACLを確認するだけでS3のコンテンツをpublic-readに変更するわけではないので、確認用に使います。 ここでS3内のファイル構造がWindowsのものと違うことで違和感があったので、改めて調べ直しました。 S3内では、下記のような構造になっており、keyごとにアクセス権限を指定する必要があるようです。 +- bucket (=サーバー) +-- prefix (=ディレクトリ) +--- key (=ファイル) bucketやprefix配下をCLIですべてpublic-readにしたいですが、今のところ方法が見つかりません。

参考サイト

ACLを変更するコマンド

object単位のACL指定コマンド

aws s3api put-object-acl --bucket [bucket name] --key "static/index.html" --acl public-read
これでオブジェクト単位でACLpublic-readに指定することができましたが、5000ほどあるオブジェクトを更新していくのは効率的でないように感じるので、別の方法を探します。

プレフィックス単位のACLの指定は公式リファレンスから見つけられなかった。

バケット単位でACL指定

$ aws s3api put-bucket-acl --bucket [bucket name]  --acl public-read
エラーは吐かれませんでしたが、成功しているのか不明です。
$ aws s3api get-bucket-acl --bucket [bucket name]
{
    "Owner": {
        "DisplayName": "***********",
        "ID": "212020e7bd02e8b1fd6d1df75f7a838f335ad9e8dfe0bb05806cc3ca01967b7d"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "***********",
                "ID": "212020e7bd02e8b1fd6d1df75f7a838f335ad9e8dfe0bb05806cc3ca01967b7d",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "Type": "Group",
                "URI": "https://acs.amazonaws.com/groups/global/AllUsers"
            },
            "Permission": "READ"
        }
    ]
}
できているように見えますが、ブラウザからはアクセスできませんでした。

command

$ aws s3api get-public-access-block --bucket [bucket name]
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}
aws s3api put-public-access-block --bucket [bucket name] --public-access-block-configuration  "BlockPublicAcls=false, IgnorePublicAcls=false, BlockPublicPolicy=false, RestrictPublicBuckets=false"

aws s3api get-bucket-policy-status --bucket [bucket name]

代案の検証

  1. s3に静的コンテンツをアップロードsyncする。
  2. アップロードしたらprefixのファイルを全部取得する。
  3. 取得した全ファイルに対してshellでput-object-acl public-readする。