[AWS]S3に特定のユーザのみアクセス許可をさせる

どうも、ざわです。
油そばが食べたいそんな気分です。

やること

さて、ローカル環境やオンプレのサーバからS3にデータを入れていきたいので、専用のユーザを作成します。
動作確認にaws cliを使用するのでインストールしておきます。
[公式]

AWS CLI をインストールして設定します。

手順は以下です。

  1. S3バケットの作成
  2. IAMユーザの作成
  3. 権限付与

S3バケットの作成

マネージコンソール(管理画面)からサービス → S3 → バケットを作成する。
今回は適当に「demo-s3-iam-role」というバケットを作成して進めます。(roleって名前はミスりましたが編集上の都合でこのまま進めます><)

IAMユーザの作成

サービス → IAM → ユーザ → ユーザを追加 から上記S3専用のIAMユーザを作成します。
ユーザ名はバケット名と同じく「demo-s3-iam-role」としてます。わかりやすければ何でもOKです。

いったんグループ作成などはせず、アクセス権限ない状態でユーザを作成してみましょう。

CSVをダウンロードしておきます。

動作確認

aws cliのクレデンシャルに作成したユーザを登録します。

~/.aws/credentialsを編集します。(ない場合は作成します)
(アクセスキーとシークレットキーはCSVから参照)

[demo]
aws_access_key_id = [アクセスキー]
aws_secret_access_key = [シークレットキー]

以下のコマンドでアクセスできるか確認してみます。

$ aws s3 ls demo-s3-iam-role --profile demo

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

「AccessDenied」と表示され、拒否されたことが確認できました。

権限付与

では、権限付与を行いましょう。

IAM → ユーザ → 「demo-s3-iam-role」から「アクセス権限の追加」クリックします。

「独自のポリシーを作成」を選択します。

ポリシー名を「demo-s3-iam-role」、
ポリシードキュメントは以下の通り設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::demo-s3-iam-role"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::demo-s3-iam-role/*"
        }
    ]
}

ポリシーの作成 + 選択し、グループを作成します。

グループをユーザに付与したら完了です。

動作確認

以下のコマンドでバケットにアクセスできるか確認してみます。

$ aws s3 ls demo-s3-iam-role --profile demo

「AccessDenied」は表示されなくなりました!
何かファイルをバケットに追加してみます。

$ touch test.text
$ aws s3 cp test.text s3://demo-s3-iam-role --profile demo
upload: ./test.text to s3://demo-s3-iam-role/test.text

ファイルが追加できたか確認してみます。

$ aws s3 ls demo-s3-iam-role --profile demo
2017-09-10 19:49:06          0 test.text

追加できてますね!

おまけ

削除してみると・・・?

$ aws s3 rm s3://demo-s3-iam-role/test.text --profile demo
delete failed: s3://demo-s3-iam-role/test.text An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied

権限不足です。

削除させたい場合はバケットポリシーに「s3:DeleteObject」を追加するか
「s3:*」を付与して該当バケットに対してフル権限を与えます。

IAM → ポリシー → 「demo-s3-iam-role」 から「ポリシーの編集」をクリックし、以下の内容に修正します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::demo-s3-iam-role"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::demo-s3-iam-role/*"
        }
    ]
}

編集を保存してもう一度試してみましょう。

$ aws s3 rm s3://demo-s3-iam-role/test.text --profile demo
delete: s3://demo-s3-iam-role/test.text
$ aws s3 ls s3://demo-s3-iam-role --profile demo

削除もできるようになりました!

サーバサイドエンジニア。オムライスが好物

シェアする

  • このエントリーをはてなブックマークに追加

フォローする