S3のオブジェクトのユーザー独自ヘッダのキーは、任意のキー名が付けれると思っていたのですが、実際は、x-amz-meta-XXXといったフォーマットのキーしか、独自ヘッダとしては許されないようです。

詳細は、Object Key and Metadataに記載されています。

ちなみに、AWS Management Consoleでは、下記のように設定することができます。

実際にヘッダを確認すると、下記のように追加されていることが確認できます。

# telnet s3.amazonaws.com 80
Trying 207.171.187.117...
Connected to s3-2.amazonaws.com.
Escape character is '^]'.
GET /cdn.suz-lab.com/test.txt HTTP/1.0

HTTP/1.1 200 OK
x-amz-id-2: m+2B6TDviSCu71iGMVYVAOpkTJ23cmS47cpmlNSeRqTgGDEvkREZJmdBJG9iA6+D
x-amz-request-id: 7205A2D5660FA45B
Date: Thu, 02 Jun 2011 13:55:20 GMT
x-amz-meta-test: test
Last-Modified: Thu, 02 Jun 2011 13:53:49 GMT
ETag: "a56f703539f4182f33ae6d8d83910c49"
Accept-Ranges: bytes
Content-Type: text/plain
Content-Length: 945
Connection: keep-alive
Server: AmazonS3

...
Connection closed by foreign host.

s3cmdでヘッダの追加で紹介したs3cmdの場合、 下記のように独自ヘッダを付けることが可能です。
(–add-headerオプションにkey:valueで指定します)

# s3cmd --add-header=x-amz-meta-test2:test2 put /tmp/test.txt s3://cdn.suz-lab.com/test.txt
/tmp/test.txt -> s3://cdn.suz-lab.com/test.txt  [1 of 1]
 5 of 5   100% in    1s     2.71 B/s  done

こちらも、AWS SDK for PHPでS3にファイルアップロードにて紹介しましたが、
PHP(AWS SDK)の場合は次のとおりです。

require_once("/opt/aws/php/sdk.class.php");

define("AWS_KEY"       , "AAAAAAAA");
define("AWS_SECRET_KEY", "SSSSSSSS");

$s3 = new AmazonS3();
$s3->set_region(AmazonS3::REGION_US_E1);

$response = $s3->create_object("cdn.suz-lab.com", "test.txt", array(
  "fileUpload"  => "test.txt",
  "acl"         => AmazonS3::ACL_PUBLIC,
  "contentType" => "text/plain",
  "meta"        => array(
    "test3" => "test3"
  )
));

var_dump($response);

metaの配列に、独自ヘッダのkeyとvalueを連想配列で指定していますが、注意する点は、keyとしてtest3を指定しても、実際に追加される独自ヘッダのキーはx-amz-meta-test3となります。

一年間、業務でAWSにしか携わっていないはずなのに、まだ知らないことだらけです。。。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら