Ansible s3_sync モジュールで必要なポリシー

Ansible 2.3 で追加された s3_sync モジュールAWS CLI の s3 sync 相当の機能追加は嬉しい限りと、早速使ってみたのだが次のエラーが出てしまう。

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

該当 IAM ユーザーのポリシーでは s3:* のように全操作を許可しているのに。

{
  "Effect": "Allow",
  "Action": [
    "s3:*"
  ],
  "Resource": [
    "arn:aws:s3:::bucket-name",
    "arn:aws:s3:::bucket-name/*"
  ]
}

しばらく嵌まっていたのだが、エラーメッセージに「ListBuckets operation」と出ていたのに、これを「ListObjects operation」と思い込んでいた。バケットリストを取得するには確かに Resource をもう一段上の階層にしなければいけない。

そこで IAM ユーザーのポリシーに ListAllMyBuckets アクションを許可するよう下の記述を追加したら、エラーは消え、無事に s3 sync が実行できるようになった。

{
  "Effect": "Allow",
  "Action": "s3:ListAllMyBuckets",
  "Resource": "arn:aws:s3:::*"
}

しかし、この行がエラーを出していた箇所(2017/4/7 現在)なのだが、ここで s3.list_buckets() メソッドを実行する必要があるのか? AWS の認証情報確認のために実行しているように見えるが、s3_sync の bucket オプションは必須なのだから余計なポリシーを要する操作でない方がいいはず。

<追記>
上記について Issue 投稿した。https://github.com/ansible/ansible/issues/23409

Last updated on April 10, 2017