ドット付きのS3バケットからGCSへファイルコピーをする方法

通常、S3からGCSへのファイル移動する時には、両方のアクセスキー設定を行い
gsutilコマンドを使うことで転送ができるが、S3のバケット名に`.` が入っているとエラーになってしまう。

## 結論
AWS側の設定は `$HOME/.boto` に記述する。
必要最低限の項目は以下のもの。

```$HOME/.boto
[Credentials]
aws_access_key_id = <AWSのアクセスキー>
aws_secret_access_key = <AWSのシークレットキー>

s3_host = s3-ap-northeast-1.amazonaws.com

[Boto]
https_validate_certificates = False

[s3]
calling_format = boto.s3.connection.OrdinaryCallingFormat
```

# 以下調査メモ
S3のバケット `hoge.fuga` から、GCSへファイル転送をする時。

## アクセスキー情報を入れただけの時
### 設定ファイル
```$HOME/.boto
[Credentials]
aws_access_key_id = <AWSのアクセスキー>
aws_secret_access_key = <AWSのシークレットキー>
```

### 実行結果
```
$ gsutil ls s3://hoge.fuga/sample.txt
Failure: Host hoge.fuga.s3.amazonaws.com returned an invalid certificate (remote hostname "hoge.fuga.s3.amazonaws.com" does not match certificate): {'crlDistributionPoints': (u'http://crl3.digicert.com/DigiCertBaltimoreCA-2G2.crl', u'http://crl4.digicert.com/DigiCertBaltimoreCA-2G2.crl'), 'subjectAltName': (('DNS', '*.s3.amazonaws.com'), ('DNS', 's3.amazonaws.com')), 'notBefore': u'Sep 22 00:00:00 2017 GMT', 'caIssuers': (u'http://cacerts.digicert.com/DigiCertBaltimoreCA-2G2.crt',), 'OCSP': (u'http://ocsp.digicert.com',), 'serialNumber': u'0551B592FA53CF2052B8B70F275CC159', 'notAfter': 'Jan  3 12:00:00 2019 GMT', 'version': 3L, 'subject': ((('countryName', u'US'),), (('stateOrProvinceName', u'Washington'),), (('localityName', u'Seattle'),), (('organizationName', u'Amazon.com Inc.'),), (('commonName', u'*.s3.amazonaws.com'),)), 'issuer': ((('countryName', u'US'),), (('organizationName', u'DigiCert Inc'),), (('organizationalUnitName', u'www.digicert.com'),), (('commonName', u'DigiCert Baltimore CA-2 G2'),))}.
```

### 参考にしたサイト
[ドット(.)を含むS3バケットへgsutilからアクセスする](https://qiita.com/tnir/items/fa47f016fbcb8f7dc969#%E3%81%93%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E5%8E%9F%E5%9B%A0)

## https_validate_certificatesの設定を追加する

### 設定ファイル

```$HOME/.boto
[Credentials]
aws_access_key_id = <AWSのアクセスキー>
aws_secret_access_key = <AWSのシークレットキー>

[Boto]
https_validate_certificates = False
```

### 実行結果
```
gsutil ls s3://hoge.fuga/sample.txt
Failure: hostname u'hoge.fuga.s3.amazonaws.com' doesn't match either of '*.s3.amazonaws.com', 's3.amazonaws.com'.
```

### 参考にしたサイト
[python - Can't connect to S3 buckets with periods in their name, when using Boto on Heroku - Stack Overflow](https://stackoverflow.com/questions/27652318/cant-connect-to-s3-buckets-with-periods-in-their-name-when-using-boto-on-herok)


## calling_formatの設定を追加する

### 設定ファイル
```$HOME/.boto
[Credentials]
aws_access_key_id = <AWSのアクセスキー>
aws_secret_access_key = <AWSのシークレットキー>

[Boto]
https_validate_certificates = False

[s3]
calling_format = boto.s3.connection.OrdinaryCallingFormat
```

### 実行結果
```
$ gsutil ls s3://hoge.fuga/sample.txt
ServiceException: 301
```

### 参考サイト
[Can't use bucket names with dots · Issue #2836 · boto/boto · GitHub](https://github.com/boto/boto/issues/2836#issuecomment-88297067)

## s3_hostを追加する

### 設定ファイル
```$HOME/.boto
[Credentials]
aws_access_key_id = <AWSのアクセスキー>
aws_secret_access_key = <AWSのシークレットキー>

s3_host = s3-ap-northeast-1.amazonaws.com

[Boto]
https_validate_certificates = False

[s3]
calling_format = boto.s3.connection.OrdinaryCallingFormat
```

### 実行結果
```
$ gsutil ls s3://hoge.fuga/sample.txt
s3://hoge.fuga/sample.txt
```

みれた。s3からgcsへのコピーもできた。