猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

AWS で S3 の特定のバケットだけアクセス可能な IAM ポリシーを作成するのにつまづいた

f:id:yoshiki_utakata:20201225212533p:plain

結論

正しい書き方はこうっぽい

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::lgtmoon-dev",
                "arn:aws:s3:::lgtmoon-dev/*"
            ]
        }
    ]
}

誤った書き方

最初はこう書いていた。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::lgtmoon-dev"
            ]
        }
    ]
}

だってなんかそれっぽいじゃん。

権限の確認方法

権限の確認には AWS CLI を使うと良い。AWS CLI の詳細は割愛。インストール方法は pip install awscli

AWS CLI の S3 関連のコマンドは以下の Qiita が参考になる。

qiita.com

作成した IAM ポリシーを付与したユーザーを作り、access key id と secret access key を生成する。生成した key と secret を ~/.aws.credentials に追記する。プロファイル名を lgtmoon_dev とした。

[lgtmoon_dev]
aws_access_key_id = 
aws_secret_access_key = 
region = ap-northeast-1

aws s3 ls s3://バケット名 --profile プロファイル名 等のコマンドで、権限が正常に付与されていることを確認する。

# バケットに入っているファイル一覧を取得する
$ aws s3 ls s3://lgtmoon-dev --profile lgtmoon_dev
2020-12-24 13:05:42     131222 10

# ファイルをアップロードしてみる
$ aws s3 cp ~/Downloads/IMG_0755.JPG s3://lgtmoon-dev/test --profile lgtmoon_dev
upload: Downloads/IMG_0755.JPG to s3://lgtmoon-dev/test

バケットの中身を見られる権限と、アップロードの権限が付与されていることがわかる。

ファイルの中身を取得する権限など、細かく権限が別れているので、付与している権限をもとに、上記 Qiita に書いてあるコマンドを試し、正しく権限が付与できているかどうか確認する。

例えば、単に aws s3 ls とするとバケット一覧が取得できるが、この IAM ポリシーではバケット一覧を表示する権限はなく、アクセスが弾かれる。

$ aws s3 ls --profile lgtmoon_dev

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

まとめ

IAM の S3 回りの権限を正しく付与するのは大変。

でも、権限を雑に設定しているほうが危険なので、頑張ってちゃんと設定しよう。