常識の範疇かもしれないけど、数時間悩んだ挙句に解決した時には「これ半年ぐらい前にもやった気がする」と思ったので、僕が3回目に悩んだときのためにメモしておく。
AWS CLIでポリシーのjsonファイルを指定するとMalformedPolicyエラー
AWS CLIでS3バケットにポリシーを設定する put-bucket-policy
では、ポリシードキュメントをJSONファイルとしてあらかじめ用意しており、 --policy
オプションで指定する。公式ドキュメントのExampleは以下のようになっている。
aws s3api put-bucket-policy --bucket MyBucket --policy file://policy.json
きっとフルパスで指定するのが無難だろう、でもWindowsの場合区切り文字やドライブはどう描くのが正解かなと思いながらいくつかやってみると、次のようなエラーになる。
A client error (MalformedPolicy) occured: policies must be valid JSON and the first byte must be '{'
正しいJSON形式ではないというのだから、JSONLintでチェックしたり、文字コードや改行コード疑ったりもしたが、解決しない。
Windowsでは file://C:\Temp\policy.json
のように指定
答えはStackoverflowに書かれてた。問題はJSONファイルの内容ではなくて、ファイルパスの指定方法だった。
ポリシーファイルパスには
file://
プロトコルをつけることが必要$ aws s3api put-bucket-policy --bucket kryptonite \
--policy file:///home/superman/aws-example/public-bucket-policy.json
もしくは(Windows)
$ aws s3api put-bucket-policy --bucket kryptonite \
--policy file://C:\Temp\public-bucket-policy.json
もしくは(相対パス)
$ aws s3api put-bucket-policy --bucket kryptonite \
--policy file://public-bucket-policy.json
Windowsでは file://C:\Temp\policy.json
のようにフルパスを指定するらしい。 file://C:\Temp
ってまさかと思うけど、これでポリシーの設定ができた。まさかと思うけど、これでいいのだ。