S3 ( minio ) と プロキシサーバ ( nginx ) の構築、クライアント( AWS CLI, AWS SDK for Java ) の設定・実装

# 概要

以下構成を構築してみます。

```md
+-------------------------------------------+
| S3クライアント ( AWS CLI , AWS SDK for Java ) |
+----+--------------------------------------+
     |
+----v--------------------------------------+
| プロキシサーバ ( nginx ) 192.168.0.100:10080 |
+----+--------------------------------------+
     |
+----v--------------------------------------+
| S3 ( minio )          192.168.1.100:9000  |
+-------------------------------------------+
```

## S3互換オブジェクトストレージ ( minio )

ワンコマンドで起動。

```sh
$ docker run -p 9000:9000 --name minio1 \
  -e "MINIO_ACCESS_KEY=minio" \
  -e "MINIO_SECRET_KEY=miniotest" \
  -v /mnt/data:/data \
  minio/minio server /data
```

AccessKey、SecretAccessKeyは以下となります。

key | value |
--- | --- |
AccessKey | minio
SecretAccessKey | miniotest

## nginx

192.168.0.100:10080でlistenし、
minio(192.168.1.100:9000)にproxyする設定例です。

```nginx
server {
    listen  10080;
    server_name  192.168.0.100;
    ignore_invalid_headers off;
    location / {
        proxy_pass http://192.168.1.100:9000;
        proxy_http_version 1.1;
    }
}
```

## S3クライアント

プロキシサーバ経由でS3にアクセスする設定、実装例を紹介します。

### AWS CLI 

profileを設定しておきます。

```sh
$ aws configure --profile minio
AWS Access Key ID [None]: minio
AWS Secret Access Key [None]: miniotest
Default region name [None]:
Default output format [None]:
$
```

環境変数`HTTP_PROXY`でプロキシサーバを指定できます。
参考 : [HTTP プロキシを使用する - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-proxy.html)


```
$ HTTP_PROXY=http://192.168.0.100:10080 aws --profile minio --endpoint-url http://192.168.1.100:9000 s3api create-bucket --bucket example
```

### AWS SDK for Java

`ClientConfiguration`にプロキシサーバのHost, Portを設定できます。
参考 : [クライアント側の設定 - AWS SDK for Java](https://docs.aws.amazon.com/ja_jp/sdk-for-java/v1/developer-guide/section-client-configuration.html#proxy-configuration)

```java
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;

public class Example {

    private static final String endpoint = "http://192.168.1.100:9000"; 
    private static final String region = "ap-northeast-1";
    private static final String accessKey = "minio";
    private static final String secretAccessKey = "miniotest";

    // proxy
    private static final String http_proxy = "http://192.168.0.100";
    private static final int http_proxy_port = 10080;

	public void exemple(){

        ClientConfiguration clientConf = new ClientConfiguration();
        clientConf.setProxyHost(http_proxy);
        clientConf.setProxyPort(http_proxy_port);
        
        AmazonS3 client = AmazonS3ClientBuilder.standard()
            .withEndpointConfiguration(new EndpointConfiguration(endpoint, region))
            .withClientConfiguration(clientConf)
            .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretAccessKey)))
            .build();

        client.createBucket("test");
    }
}
```

## まとめ

S3 ( minio ) とプロキシサーバ ( nginx ) を構築しクライアント ( AWS CLI , AWS SDK ) からアクセスする手順を紹介しました。
S3を利用する開発環境の構築などに役立ちましたら幸いです。