AWSのSDK周りのセットアップを何個かの言語で試してみた。


個人用メモです。以下について記載しています。
AWSに普段触る機会がないので初心者です。ご了承ください。

* Credentialの設定
* AWS CLIの設定
* AWS SDKの設定(AWS触る際、自分で使いそうな言語についてのみ記載しています。)
    * Go
    * Node.js
    * Ruby
    * Python
    * Java 
* AWS S3に対して簡単な疎通確認アプリを書いてみる。(各言語で)

## Credentialの設定

### そもそものIAMユーザの作成方法

1. IAM コンソールに移動します (最初に AWS へのサインインが必要になる場合があります)。
1. サイドバーの [Users (ユーザー)] をクリックして IAM ユーザーを表示します。
1. IAM ユーザーを設定していない場合は、[Create New Users (新規ユーザーの作成)] をクリックして作成します。
1. AWS にアクセスするために使用するリストで、IAM ユーザーを選択します。
1. [Security Credentials (セキュリティ認証情報)] タブを開き、[Create Access Key (アクセスキーの作成)] をクリックします。
1. 表示されるダイアログボックスで、[Download Credentials (認証情報のダウンロード)] ボタンをクリックして認証情報ファイルをコンピュータにダウンロードするか、[Show User Security Credentials (ユーザーのセキュリティ認証情報を表示)] をクリックして IAM ユーザーのアクセスキー ID とシークレットアクセスキーを表示します 



### `~/.aws/credentials`の設定

これがないと、ローカルで開発するときに、ソースやら環境変数やらにアクセスキー、シークレットキーの情報を埋め込まないといけなくなるので、こういうセキュアな情報はここで管理する。

```~/.aws/credentials
[default]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットキー
```

### `~/.aws/config`の設定

```~/.aws/config
[default]
region = ap-northeast-1
```


## AWS CLI のインストール

pipのインストール

```
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
```

`awscli`のインストール

```
pip install awscli
```

helpの確認

```
aws help
```

## AWS SDKの設定

### AWS SDK for Goの設定

https://docs.aws.amazon.com/ja_jp/sdk-for-go/v1/developer-guide/setting-up.html

```
go get -u github.com/aws/aws-sdk-go
```

### AWS SDK for Node.jsの設定

https://aws.amazon.com/jp/developers/getting-started/nodejs/

```
npm install aws-sdk
```


### AWS SDK for Rubyの設定
https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/developer-guide/setup-install.html

**Bundlerを使用している場合**

`Gemfile`に以下追記して`bundle install`。

```Gemfile
gem 'aws-sdk'
```

**Bundlerを使用していない場合**

以下のコマンドを実行する。

```
gem install aws-sdk
```


### AWS SDK for Pythonの設定

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html

```
pip install boto3
```

### AWS SDK for Javaの設定

Javaがいちばんめんどくさい。
https://docs.aws.amazon.com/ja_jp/sdk-for-java/v2/developer-guide/getting-started.html

#### Apache MavenでSDKを利用する場合

以下参考に、`pom.xml`に以下設定する。
https://docs.aws.amazon.com/ja_jp/sdk-for-java/v1/developer-guide/setup-project-maven.html


#### GradleでSDKを利用する場合

以下参考に、`build.gradle`を作成する。
https://docs.aws.amazon.com/ja_jp/sdk-for-java/v1/developer-guide/setup-project-gradle.html


## AWS S3に対して簡単な疎通確認アプリを書いてみる。(各言語で)

上でセットアップしたSDKがとりあえず動作するかを確かめるためにS3に疎通するアプリを簡単に書いてみました。

### AWS SDK for Go

まずはGo言語で書いてみました。

```go
package main

import (
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"log"
)

/**
	S3Clientを生成する
 */
func CreateS3Client() *s3.S3 {
	sess, err := session.NewSession(&aws.Config{
		Region: aws.String("ap-northeast-1")}, )

	if err != nil {
		log.Fatal("Error creating session", err)
	}
	return s3.New(sess)

}

/**
	バケット一覧を表示する
 */
func ListBuckets() {
	svc := CreateS3Client()
	input := &s3.ListBucketsInput{}

	result, err := svc.ListBuckets(input)
	if err != nil {
		if aerr, ok := err.(awserr.Error); ok {
			switch aerr.Code() {
			default:
				log.Fatalln(aerr.Error())
			}
		} else {
			// print the error, cast err to awserr.Error to get the Code and Message from an error.
			log.Fatalln(err.Error())
		}
		return
	}
	fmt.Println(result)
}

/**
	バケットを作成する
 */
func CreateBucket(bucketName string) {
	svc := CreateS3Client()
	input := &s3.CreateBucketInput{
		Bucket: aws.String(bucketName),
	}

	result, err := svc.CreateBucket(input)

	if err != nil {
		if aerr, ok := err.(awserr.Error); ok {
			switch aerr.Code() {
			case s3.ErrCodeBucketAlreadyExists:
				log.Fatalln(s3.ErrCodeBucketAlreadyExists, aerr.Error())
			case s3.ErrCodeBucketAlreadyOwnedByYou:
				log.Fatalln(s3.ErrCodeBucketAlreadyOwnedByYou, aerr.Error())
			default:
				log.Fatalln(aerr.Error())
			}
		} else {
			log.Fatal(err.Error())
		}
		return
	}

	fmt.Println(result)

}

func main() {
	CreateBucket("examplebucket42142gaga")
	ListBuckets()
}
```

### SDK for Node.js

この辺からすごいテキトー。

```js
const AWS = require('aws-sdk');

class MyS3Client
{
  constructor(bucketName)
  {
    this.s3 = new AWS.S3();
    this.bucketName = bucketName;
  }

  createNewBucket(bucketName)
  {
    this.s3.createBucket({ Bucket: this.bucketName }, (err, _) =>
    {
      if (err) console.error('Create Buckect failed..', err);
      console.log(`Created Bucket: ${this.bucketName}`);
    })
  }

  putTestObject()
  {
    const keyName = "hello-world.txt";
    const params = { Bucket: this.bucketName, Key: keyName, Body: 'Hello World!' };
    this.s3.putObject(params, (err, _) =>
    {
      if (err) console.error('Put object failed..', err);
      console.log(`Put Object complete: ${keyName}`);
    });
  }
}

const myS3Client = new MyS3Client('chocomint-klklkk');
myS3Client.createNewBucket();
myS3Client.putTestObject();
```

### SDK for Ruby

```ruby
require 'aws-sdk'

# S3のResourceを生成する。
def s3_resouce_factory
  region = 'ap-northeast-1'
  Aws::S3::Resource.new(region: region)
end

# バケット一覧を表示する。
def show_list_buckets
  s3 = s3_resouce_factory
  s3.buckets.each do |bucket|
    puts "#{bucket.name}"
  end
end

# 新しいバケットを作成する。
def create_new_bucket(bucket_name)
  s3 = s3_resouce_factory
  s3.create_bucket(bucket: bucket_name)
end

create_new_bucket('random-example-bucket-by-48hands')
show_list_buckets
```

### SDK for Python

すごいテキトー。

```python
import boto3


class SampleS3App(object):
    def __init__(self):
        self.s3 = boto3.resource('s3')


    def show_list_bucket(self):
        """バケット一覧を表示する"""
        for bucket in self.s3.buckets.all():
            print(bucket.name)


    def create_new_bucket(self, bucket_name):
        """
        バケットを新規に作成する
        :param bucket_name: 新しく作成するバケット名
        :return:
        """
        response = self.s3.create_bucket(
            Bucket=bucket_name,
            CreateBucketConfiguration={
                'LocationConstraint': 'ap-northeast-1'
            },
        )
        return response


if __name__ == '__main__':
    sample = SampleS3App()

    sample.create_new_bucket("48hands-hogehogehoea")
    sample.show_list_bucket()
```

### SDK for Java

Kotlinで書いてみました。
すごいテキトー。

```kotlin
import com.amazonaws.services.s3.AmazonS3ClientBuilder
import com.amazonaws.services.s3.model.ListBucketsRequest


class SampleS3App {
    private val s3Client = AmazonS3ClientBuilder.defaultClient()

    /**
     * 新しいバケットを作成する
     */
    fun createNewBucket(bucketName: String) {
        s3Client.createBucket(bucketName)
    }

    /**
     * バケット一覧を表示する
     */
    fun showListOfBucket() {
        val listBucketsRequest = ListBucketsRequest()
        s3Client.listBuckets(listBucketsRequest)
            .forEach { println(it.name) }
    }
}

fun main(args: Array<String>) {
    val sampleS3App = SampleS3App()
    sampleS3App.createNewBucket("48hands-i-love-newyork")
    sampleS3App.showListOfBucket()
}
```