タグ: s3

  • About the concept of S3 directories

    Introduction

    Most of the tasks in aws can be operated with aws commands. The only command I couldn’t find in the official documentation was “create folder,” which should be on the screen.

    The concept of a folder in S3

    In fact, the concept of folders does not exist in S3. https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingMetadata.html

    The data model of Amazon S3 is a flat structure. Buckets are created and objects are stored in those buckets. There is no hierarchy of sub-buckets or sub-folders. However, a logical hierarchy can be implied by using key name prefixes and delimiters, such as those used in the Amazon S3 console.

    So, for one bucket, there are no folders in it, and it is an image of a large number of files.

    So what do we do?

    I don’t have a directory, but I’ll just dump it in directly!

    aws s3 cp sample.txt s3://test/sample-folder/


    This will create a sample-folder in the test bucket. Copy the sample.txt file into it. Reference: Breaking the illusion of “folder” in Amazon S3 and revealing its reality https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/

    If multiple environments are registered in the .aws directory, it is possible to specify the profile to be loaded with -profile role-a-profile.

    If you want to copy the whole directory, use

    --recursive
    option to copy the entire directory recursively.

  • boto3 でファイルをアップロードする

    python 経由で s3 にファイルをアップロードしたくなる場合がある。

    本記事はその際のメモ。

    import boto3
    
    # 書き込み先バケット
    BUCKET = 'output-bucket'
    INPUT= 'hoge.csv'
    OUTPUT = 'hoge.csv'
    # OUTPUT = 'DIR/DIR/hoge.csv'
    
    
    s3 = boto3.resource('s3')
    s3.Bucket(BUCKET).upload_file(Filename=INPUT, Key=OUTPUT)
    
    

    ポイントとして、書き込み先の s3 のディレクトリに対し書き込むとき、存在しないディレクトリを対象にすると、存在しないディレクトリは一緒に作られる。これは、そもそも s3 にディレクトリという考えがないためである。

    それについては以下の記事を参照

  • S3 バケットに対して特定IP からのみ接続を許可する

    バケットに接続できる IP を絞りたいことがある。バケットポリシーを記載することで制御可能なので方法を紹介。

    ブロックパブリックアクセス (バケット設定)

    ブロックパブリックアクセスはすべてオフにする

    バケットポリシー

    バケットポリシーの設定は以下の通り

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Deny",
                "Principal": "*",
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::tsukada-hoge-js",
                    "arn:aws:s3:::tsukada-hoge-js/*"
                ],
                "Condition": {
                    "NotIpAddress": {
                        "aws:SourceIp": [
                            "1.1.1.111/32",
                            "2.2.2.222/32"
                        ]
                    }
                }
            }
        ]
    }

    ポイントとして、

    Resource にバケット自体を宣言するのとは別にバケット配下を /* でワイルドカードで指定する必要があるという点だ。

  • S3 のバケットを誤って公開した場合の検知方法

    S3 のバケットを誤って公開してしまった時、どのように検知するかをまとめた。

    案は2つ

    1. Lambda を呼び出して、 S3 バケットを保護する CloudWatch Events ルールを設定
    2. S3 のオブジェクトレベルのログを有効にして、 CloudTrail でパブリック読み取りアクセス許可を持つ PutObject API が検出されたとき、 SNS に通知するような CloudWatch イベントを作る。

    この2つの方法は取ることができるが、単純に案1 の s3 から Lambda をトリガーしてチェックを行うのは実装は簡単そう。

    しかし、やろうと思えば案2 の仕組みをつくることもできる。

  • s3のファイルのバージョニングを有効化した際の挙動

    s3 のバージョン管理を有効した場合の振る舞いについて整理する。

    そもそもバージョニングとは、同じバケット内でオブジェクトの複数のバージョンを保持する手段。

    バージョニングを使用して、Amazon S3 バケットに格納されたあらゆるオブジェクトのあらゆるバージョンを、格納、取得、復元することができるようになる。

    バージョニングを使用すれば、アプリケーション障害からも、簡単に復旧でき流。

    S3バージョン管理を有効にすると、既存のファイルはすべて、バージョンIDがNULLになる。

    バージョン管理後に追加されると、そのファイルの バージョンIDは ランダム値が割り振られる。

    公式ドキュメントは以下の通り

    https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/Versioning.html

  • s3内の特定ファイルを特定の国に対して利用できないようにする際に考えること

    以下の2つの要件を満たしたい時がある

    • 特定の国に対して利用できないようにしたい。
    • コンテンツを世界中のユーザーに低レイテンシーで配信したい。

    CloudFront ウェブディストリビューションを活用する。

    https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html

    CloudFront ウェブディストリビューションを使うことで配信しているコンテンツに対し特定地域のユーザーによるアクセスを回避することができる。地域制限を使用するには、次の 2 つの方法が考えられる。

    ・CloudFront の地理制限機能の使用
    エッジロケーションによる地理的制限を有効化。

    ディストリビューションに関連するすべてのファイルへのアクセスを制限し、国レベルでアクセスを制限する場合は、この方法を使用する。 

    これをすると、S3 の公開しているバケットの中のファイル全てに制限をかけることができる。特定のファイルにのみ制限をかけることはできない。

    ・サードパーティの位置情報サービスの使用

    上記 CloudFront の地理制限機能を使って要件を満たすことができない場合は、サードパーティのツールを探すことになる。

    なお、Lambda@エッジを利用した制限アルゴリズムを連携するといった機能は現状存在しない。