Go言語でAWSを操る: パッケージsessionについて

---
<font color="Tomato">Go</font>言語で<font color="green">AWS</font>を操る: パッケージsessionについて
---


**とあるバンドマン**

<font color="DarkKhaki">_「いやー、いいセッションだったね」_<font>

<font color="SeaGreen">_「こちらこそ、魂が震えるライブだった」_<font>

<font color="DarkKhaki">_「それにしてもこんな所で、こんな良いギタリストに出会えるとは」_<font>

<font color="SeaGreen">_「私こそ！こんなに良いドラマーに出会えるとは」_<font>

<font color="DarkKhaki">_「いやー」_<font>

<font color="SeaGreen">_「いやー」_<font>

<font color="Fuchsia">_「「ここが異世界でなければなー」」_<font>

<font color="SeaGreen">_「あの私たちをひいてきたトラックの運転手、戻れたら一発殴りましょう」_<font>

<font color="DarkKhaki">_「一発じゃ足りませんよ」_<font>

<font color="SeaGreen">_「はっはっは！そうですな！」_<font>

<font color="DarkKhaki">_「いやはや、またいいセッションになりそうだ」_<font>

<br>

**目次**
- [1. AWSとGo言語](#1-awsとgo言語)
- [2. パッケージsession](#2-パッケージsession)
- [3. パッケージsessionの関数](#3-パッケージsessionの関数)
- [4. おわりに](#4-おわりに)

## 1. AWSとGo言語

<font color="low blue">**AWSとは**</font>

　AWS (Amazon Web Services) はアマゾン・ドット・コム（Amazon.com）が提供するクラウドコンピューティングプラットフォームおよびサービスのことを言います。

&emsp;AWSには、仮想サーバー（Amazon EC2）、オブジェクトストレージ（Amazon S3）、データベースサービス（Amazon RDS）、サーバーレスコンピューティング（Amazon Lambda）、機械学習プラットフォーム（Amazon SageMaker）など、多くのサービスが含まれています。


<font color="low blue">**AWSとGo言語の関係**</font>

　Go言語は、AWS上でのアプリケーション開発やスクリプトの作成に使用できます。例えば、Go言語を使用してAWS SDK（Software Development Kit）（ソフトウェア開発キット）を利用し、AWSのサービスを操作することができます。

　`github.com/aws/aws-sdk-go/aws`を利用して様々な機能を実現できるのです。

  その一つがパッケージsessionです。

## 2. パッケージsession

　パッケージsessionは、AWS SDKの一部で、セッション情報を管理するための機能を提供します。
 
&emsp;セッション情報はAWSサービスへの認証情報やリージョン情報などを含むため、アプリケーションがAWSサービスにアクセスする際に必要な情報を管理するのに役立ちます。

　
　`github.com/aws/aws-sdk-go/aws/session`にまとめられています。

## 3. パッケージsessionの関数

[session - Amazon Web Services - Go SDK](https://docs.aws.amazon.com/sdk-for-go/api/aws/session/)


```go
type AssumeRoleTokenProviderNotSetError
    func (e AssumeRoleTokenProviderNotSetError) Code() string
    func (e AssumeRoleTokenProviderNotSetError) Error() string
    func (e AssumeRoleTokenProviderNotSetError) Message() string
    func (e AssumeRoleTokenProviderNotSetError) OrigErr() error
type CredentialRequiresARNError
    func (e CredentialRequiresARNError) Code() string
    func (e CredentialRequiresARNError) Error() string
    func (e CredentialRequiresARNError) Message() string
    func (e CredentialRequiresARNError) OrigErr() error
type CredentialsProviderOptions
type Options
type Session
    func Must(sess *Session, err error) *Session
    func New(cfgs ...*aws.Config) *Session
    func NewSession(cfgs ...*aws.Config) (*Session, error)
    func NewSessionWithOptions(opts Options) (*Session, error)
    func (s *Session) ClientConfig(service string, cfgs ...*aws.Config) client.Config
    func (s *Session) ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) client.Config
    func (s *Session) Copy(cfgs ...*aws.Config) *Session
type SharedConfigAssumeRoleError
    func (e SharedConfigAssumeRoleError) Code() string
    func (e SharedConfigAssumeRoleError) Error() string
    func (e SharedConfigAssumeRoleError) Message() string
    func (e SharedConfigAssumeRoleError) OrigErr() error
type SharedConfigLoadError
    func (e SharedConfigLoadError) Code() string
    func (e SharedConfigLoadError) Error() string
    func (e SharedConfigLoadError) Message() string
    func (e SharedConfigLoadError) OrigErr() error
type SharedConfigProfileNotExistsError
    func (e SharedConfigProfileNotExistsError) Code() string
    func (e SharedConfigProfileNotExistsError) Error() string
    func (e SharedConfigProfileNotExistsError) Message() string
    func (e SharedConfigProfileNotExistsError) OrigErr() error
type SharedConfigState
```

　多いですね。
 以下に簡単に意味と使い方をまとめます。
 <br>

<font color="low blue">**1. AssumeRoleTokenProviderNotSetError**</font>

説明: AssumeRoleTokenProviderNotSetErrorは、AWSのAssumeRole関数を使用する際に、トークンプロバイダーが設定されていない場合に発生します。


　トークンプロバイダーは、セキュリティトークンサービス (STS) などの認証サービスによって発行されるセキュリティトークンを取得、管理するためのコンポーネントや機能のことを指します。クラウド環境や分散システムにおいて、ユーザー認証やサービス間認証を行う際に使用されます。

　要するに、トークンプロバイダーはセキュリティ認証情報を安全に取得し、サービス間の認証に使用されるトークンを管理するやつです。

メソッド:

- Code(): エラーコードを返します。
- Error(): 標準エラーメッセージを返します。
- Message(): エラーの詳細な説明を返します。
- OrigErr(): 原因となるエラーを返します。


<font color="orange">**コード例**</font>
```go
if err, ok := err.(awserr.Error); ok && err.Code() == "AssumeRoleTokenProviderNotSetError" {
    fmt.Println(err.Message())
}
```

 <br>


<font color="low blue">**2. CredentialRequiresARNError**</font>


説明: CredentialRequiresARNErrorは、クレデンシャルがアクセスキーの代わりにARNを必要とする場合に発生します。

- クレデンシャル (Credentials):
>
>クレデンシャルは、AWSサービスに対して認証を行うために使用されるデータのセットです。これには、AWSアカウントの識別情報が含まれています。
クレデンシャルには通常、アクセスキーIDとシークレットアクセスキーが含まれます。これらは、プログラムによるAWSの利用やAPIコールを認証するために使用されます。


- アクセスキー (Access Key):

>アクセスキーは、AWSクレデンシャルの一部であり、アクセスキーIDとシークレットアクセスキーの組み合わせです。
アクセスキーIDは公開情報として扱われますが、シークレットアクセスキーは秘密情報として厳重に管理する必要があります。
この組み合わせを使用して、プログラムからAWSサービスに安全にリクエストを行います。

- ARN (Amazon Resource Name):

>ARNは、AWS内のリソースを一意に識別するための識別子です。
ARNを使用することで、ユーザー、ロール、S3バケットなど、AWSのどのリソースに対しても、そのリソースを一意に識別できます。
形式は通常 arn:partition:service:region:account-id:resource です。例えば、特定のIAMユーザーのARNは arn:aws:iam::123456789012:user/JohnDoe のようになります。

<br>

　要するに、CredentialRequiresARNErrorは、AWSにログインするための通常の「鍵（アクセスキー）」ではなく、特定の「住所（ARN）」を使ってアクセスしないといけない場面で、「住所」を教えていないときに出るエラーです。

 <br>

メソッド:　
&emsp;&emsp;上のAssumeRoleTokenProviderNotSetErrorと同じです。

<font color="orange">**コード例**</font>
```go
if err, ok := err.(awserr.Error); ok && err.Code() == "CredentialRequiresARNError" {
    fmt.Println(err.Message())
}
```
 <br>

<font color="low blue">**3. Session**</font>

説明: SessionはAWSセッションを管理し、設定とクレデンシャル情報を保存します。

主要メソッド:

- New(): 新しいセッションを作成します。
- Must(sess *Session, err error): セッションを確実に取得し、エラーがあればpanicを引き起こします。
- Copy(): セッションをコピーし、新しいセッションを作成します。


<font color="orange">**コード例**</font>
```go
sess, err := session.NewSession()
if err != nil {
    fmt.Println("Failed to create session,", err)
    return
}
```
 <br>


<font color="low blue">**4. SharedConfigAssumeRoleError, SharedConfigLoadError, SharedConfigProfileNotExistsError**</font>

説明: これらのエラーは、共有設定やプロファイルに関連する問題がある場合に発生します。

メソッド:
&emsp;&emsp;上のAssumeRoleTokenProviderNotSetErrorとかのエラー達と同じです。



<font color="orange">**コード例**</font>
```go
if err, ok := err.(awserr.Error); ok && err.Code() == "SharedConfigLoadError" {
    fmt.Println(err.Message())
}
```


<br>

　ぶっちゃけ、３番のSessionが大事だと思うので、あとはエラーと思っておけば良さそうです。(まだそんなに深く触ってないので謎ですが)

## 4. おわりに
　今、Go言語とAWSを使って開発をしているのですが、すごく便利で、設定さえしてしまえば、こんなに簡単にクラウドにデータが保存できるのか、と驚いております。

 　他にも色々と機能があるので、使っていきたいです。

人工衛星とか面白そう。