[アップデート] S3 アクセスポイントでバケット名形式のエイリアスが利用可能に!

アクセスポイントはARN経由しかダメだったところを、バケット名と同じ形式をエイリアスとしてサポートしました
2021.08.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ちゃだいん(@chazuke4649)です。

Amazon S3 アクセスポイントで、バケット名形式のエイリアス(別名)が利用可能になりました!

Amazon S3 Access Points のエイリアスは、S3 バケット名を必要とするあらゆるアプリケーションでアクセスポイントを使いやすくするためのものです

S3 Access Points のエイリアスは自動的に生成され、データアクセスにバケット名を使用する場面でどこでも S3 バケット名と入れ替え可能です。Access Points のエイリアスは、PUT、GET、LIST などのオブジェクトレベルのオペレーションをする際に、現在バケット名が使われている場所であればどこでも利用できます。バケットにアクセスポイントが作成されるたびに、S3 は新しい Access Point エイリアスを生成します。既存の S3 Access Points には、エイリアスが自動的に割り当てられ、追加の手順を踏まなくてもすぐにご利用いただけます。

今回の更新により、Amazon EMR、Amazon Storage Gateway、Amazon Athena といった AWS のサービス、Apache Spark や Apache Hive などのオープンソースパッケージ、そして Amazon Partner Network (APN) ソリューションで、コードを変更せずに追加費用もなしで S3 Access Point エイリアスをご利用いただけるようになりました。

どういうこと?

まずそもそもS3アクセスポイントについては以下ブログなどをご覧ください。

S3アクセスポイントはS3バケットへのアクセスを、複数の接続元単位(アクセスポイント単位)で柔軟にアクセス制御したい場合に便利な機能です。

ただし、今までアクセスポイントはアクセスポイントARN経由でしか利用できなかったため、既存のアプリやプログラムでバケット名で指定しているケースだとARNにそのまま置き換えることができなく、プログラム側の改修が必要でした。それによりアクセスポイントの利用を見送る状況もありました。それが今回、バケット名と同様の形式でアクセスポイントのエイリアスが使えるようになったので、今までバケット名を入力していた箇所をそのままアクセスポイントのエイリアスに置き換えるだけでよくなりました。

  • ARN arn:aws:s3:region:account-id:accesspoint/my-access-point (今まではARNのみ)
  • Alias my-access-point-hrzrlukc5m36ft7okagglf3gmwluquse1b-s3alias (これからは両方使用可能)

その他アクセスポイントエイリアスの詳細(何が嬉しいか、制約など)は、以下ブログで超わかりやすく解説されていますので、ぜひご覧ください。(大変参考になりました、ありがとうございました!)

やってみる

早速試してみます。

1.まずは普通にS3バケットに直接アップロード

適当なS3バケットchadain-test-bucket-for-accesspointを作成します。

特にバケット側でアクセス制御を行っていないため、IAMユーザー側でS3へのアクセスが許可されていれば、以下の通りS3バケットを指定してファイルをアップロードできます。

% aws s3 cp test.txt s3://chadain-test-bucket-for-accesspoint/test.txt
upload: ./test.txt to s3://chadain-test-bucket-for-accesspoint/test.txt

2.アクセスポイントを作成

続いてアクセスポイントを作成します。

S3バケットのコンソールからアクセスポイントタブを開き、アクセスポイントを作成します。

名前をchadain-test-accesspointとし、ネットワークオリジンをインターネットを選択します。その他は何もせずこれで作成します。

作成されるとご覧の通りアクセスポイントエイリアスが自動生成されました。

この時点でこのアクセスポイントエリアスが利用可能か以下コマンドを実行してみました。

% aws s3 cp test.txt s3://chadain-test-accessp-jaw4655465mdaoycrny95foq4ft6napn1b-s3alias/test2.txt
upload: ./test.txt to s3://chadain-test-accessp-jaw4655465mdaoycrny95foq4ft6napn1b-s3alias/test2.txt

S3バケット名の部分をそのままアクセスポイントエイリアスに置き換えるだけで、aws s3 cpコマンドを実行することができました。

3.バケットポリシーを変更

しかしこのままでは、S3バケットに直接アクセスできてしまいます。アクセスポイントを作った意味がありません。

先述のブログに詳細されているポリシーを参考に、以下のようなバケットポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::chadain-test-bucket-for-accesspoint/*",
            "Condition": {
                "StringNotLike": {
                    "s3:DataAccessPointArn": "arn:aws:s3:ap-northeast-1:123456789012:accesspoint/*"
                }
            }
        }
    ]
}

「任意のS3アクセスポイント経由以外(つまりS3バケット直接)のGetObjectPutObjectを禁止する」といった記述です。

こちらを設定後、先ほどと同じようにコマンドを実行します。

% aws s3 cp test.txt s3://chadain-test-bucket-for-accesspoint/test4.txt
upload failed: ./test.txt to s3://chadain-test-bucket-for-accesspoint/test4.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

S3バケット名を指定したコマンドは失敗しました。ではアクセスポイントはどうでしょうか。

% aws s3 cp test.txt s3://chadain-test-accessp-jaw4655465mdaoycrny95foq4ft6napn1b-s3alias/test5.txt
upload: ./test.txt to s3://chadain-test-accessp-jaw4655465mdaoycrny95foq4ft6napn1b-s3alias/test5.txt

こちらは変わりなくアップロードすることができました。

検証は以上です。

参考URL

Using a bucket-style alias for your access point - Amazon Simple Storage Service

Amazon S3 Access Points - アマゾン ウェブ サービス

終わりに

せっかく便利なアクセスポイント機能が誕生したのに、ARNのみという点で採用を見送っていた場合、今回のアップデートでアクセスポイントを活用できそうですね。要件的にハマると大変便利な機能なので積極的に使っていきたいです。

それではこの辺で。ちゃだいん(@chazuke4649)でした。