S3の特定のファイルだけを他の人と共有したい

S3の特定のファイルだけを他の人と共有したい

「普段はプライベートなストレージとして使っているS3の特定のファイルだけを他の人と共有したい」というケースがあったので、その方法を調べてみた。

調べてみたところ、バケットポリシーを編集して、オブジェクトに公開用のタグを付けることで、特定のオブジェクトだけを公開出来るそうだ。

参考

Step1: パブリックアクセスのブロック

参考の通り、「パブリックアクセスのブロック(バケット設定)」を編集して、

  • 新しいアクセスコントロールリスト(ACL)を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする
  • 任意のアクセスコントロールリスト(ACL)を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする

にチェックを入れて、「変更の保存」。

Step2: バケットポリシー

以下の様に設定した、バケット名は「techru-growi」である。このバケットポリシーは、publicタグの値がyesであるようなオブジェクトのパブリックアクセスを許可している。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::techru-growi/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/public": "yes"
                }
            }
        }
    ]
}

Step3: 目的のオブジェクトのタグを確認する

書式

aws s3api get-object-tagging --bucket <バケット名> --key <オブジェクト名>
$ aws s3api get-object-tagging --bucket techru-growi --key attachment/a471240d859ff1f79051846d0512d185.pdf
{
    "VersionId": "rzYZOKVVqy9ONv_v_mdgMm02NiTMogp0",
    "TagSet": []
}

タグは何も付与されていない。

Step4: publicタグを付与する

タグは、キーとバリューの組み合わせを配列でTagSetに対してセットする。

書式

aws s3api put-object-tagging --bucket <バケット名> --key <オブジェクト名> --tagging 'TagSet=[{Key=キー,Value=値}, {Key=キー,Value=値},…]'
$ aws s3api put-object-tagging --bucket techru-growi --key attachment/a471240d859ff1f79051846d0512d185.pdf --tagging 'TagSet=[{Key=public,Value=yes}]'
{
    "VersionId": "rzYZOKVVqy9ONv_v_mdgMm02NiTMogp0"
}

タグが付与されたことを確認してみる。

$ aws s3api get-object-tagging --bucket techru-growi --key attachment/a471240d859ff1f79051846d0512d185.pdf
{
    "VersionId": "rzYZOKVVqy9ONv_v_mdgMm02NiTMogp0",
    "TagSet": [
        {
            "Key": "public",
            "Value": "yes"
        }
    ]
}

Step5: ブラウザからパブリックアクセス出来ることを確認する

以下のURLでアクセス出来るかどうかを試してみた。

https://techru-growi.s3.ap-northeast-1.amazonaws.com/attachment/a471240d859ff1f79051846d0512d185.pdf

→ 問題ない。