AWS day1: Lightsail × SDK for Go

f:id:dombri:20200505210310j:plain

こんにちは。

今回から数回(回数は未定)「AWSの基礎ハンズオン奮闘記」を記していきます。

経緯

これまでAzureやGCPには業務内外でふれてきたものの、最大シェアを誇るAWSには全く触ったことがありませんでした。外部の勉強会やイベントではAWSを用いたお話を聞くことが多く「AWSのことを知っていたら・・・」と思うことも度々ありました。

そんな中 @kuromitsu_ka さんと「何か一緒のお題で勉強してアウトプットしあおう」という話になり、せっかくの機会なのでAWSハンズオンを進めることに。

全体的な目的は以下です。

  • AWS の主要サービスの名前と顔(特徴)を一致させる
  • IaC(プログラミング)に挑戦する(できればGoやりたい)
  • アウトプット!


今回の目的


1. チュートリアルLinux 仮想マシンを起動する」

まずは、AWS が提供する10分間チュートリアルをやってみます。

やること

Lightsail とは

  • コンピューティング性能、ストレージ容量、ネットワーキング機能が用意されている
  • 仮想マシンSSD ベースのストレージ、データ転送、DNS 管理、静的 IP アドレスといった、プロジェクトを開始するために必要なものすべてが提供

気軽に使えるVPSを提供してくれる、というところでしょうか。

・・・ん?
よく耳にする Amazon EC2 とは何が違うんだろう。 と思い検索したら比較ブログがいつくか見つかった。

上記から読み取ると、小規模で楽に使い始めたい場合は Lightsail, 大規模で自由にカスタマイズしたい場合は EC2 という感じですかね。


1. 事前準備

AWS にサインアップ

2. Lightsail で Amazon Linux インスタンス作成

まずはGUIでやってみた。

  • インスタンスのロケーション
  • インスタンスイメージ
  • ブループリントオプション (設計図)
  • オプション(今回は操作しない)
  • インスタンスプラン
    • 初期値の「最初の1ヶ月無料」のものを選択
    • リソース効率化されたタイプを選択することも可能
  • インスタンス
    • デフォルト[Amazon_Linux-1]
    • リソースフィルタリング用のタグ付け 請求を分類したり、アクセス制御にも使用できる
      • キーオンリータグ
      • キー値タグ

ここまでは普段使いのAzure VM とさほど変わらない。むしろ選択肢が少なくてわかりやすい。


3. 実行してみる

Lightsail コンソールで、ブラウザベースでSSHターミナルが使える。

Lightsail ホームページ [インスタンス] タブで該当のインスタンスを選択 → [接続]

簡単にSSHターミナルを表示できました。ここまでは Azure や GCP と類似点が多く問題なく進みました。


2. Challenge! AWS SDK

ちょっと物足りなかったので、AWS SDK を使ってインスタンス作成ができるかチャレンジしてみました。

様々なプログラミング言語に対応しているSDKですが、そのうち私自身の経験があるのは Java でした。ただ「これからもインフラやってくならGoだよな」と思い、せっかくのチャンスなので Go言語でやってみることに。

これが運の尽き。Go沼へ足を踏み入れることになったのです・・・


AWS SDK for Go

Top page:https://aws.amazon.com/jp/sdk-for-go/

まずはここから:https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/setting-up.html

Go のインストール:https://golang.org/doc/install


1. AWS SDK for Go のインストール

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


2. AWS Access Keys を入手

  1. IAM console を開く
  2. ナビゲーションメニューから ユーザー を選択
  3. ユーザーを追加 を選択
  4. AWS アクセスの種類を選択 で プログラムによるアクセス を選択
  5. 新しい access key 情報を見るには Show を選択
  6. Access key ID と Secret access key を確認 key pair は Download からDLできる


3. AWS SDK for Go を使う

薄々気付いてはいたのですが、茨の道を選んでしまったことを後悔し始めていました。

  • そもそも Go を知らない
  • AWSよくわからない(AWS CLI も知らない)
  • ドキュメントがほとんど英語(他の言語ならありそうなのにGoは見当たらない)

SDK ドキュメントは文法知識がある前提が書かれていてまったく歯が立たない状態だったので、Goの基礎から始めることに・・・

気を取り直して、進めていきます。


①認証情報を設定

いくつかパターンがあるらしいが、今回は credential file を用いた方法で行います。

以下のファイルを作成、配置します。

./aws/credentials

[default]
aws_access_key_id = <YOUR_TEST_ACCESS_KEY_ID>
aws_secret_access_key = <YOUR_TEST_SECRET_ACCESS_KEY>


②Go を書く

大まかなプログラムの流れは以下です。

  1. Session を作成
  2. Lightsail 用 Client を作成
  3. 各種操作
  4. 結果を表示(エラーの場合はエラーを表示)

この辺りの手順を公式Docから拾うことができず、クラスメソッドさんのブログからお知恵を借りました。


デフォルトでは、認証情報ファイルからの情報のみ読み込んでセッションを作成します。参考

  • AWS SDK for Goにおける「セッション」とは、Service Client の構成情報を含むオブジェクト
  • AWSサービスとのやり取りに使用する
  • リージョン、認証情報、追加のリクエストハンドラ関連情報
  • Service Client を作成するときは常にセッションを指定する


newsail.go

package main

import (
  "github.com/aws/aws-sdk-go/aws"
  "github.com/aws/aws-sdk-go/aws/session"
  "github.com/aws/aws-sdk-go/service/lightsail"

  "fmt"
)

func main() {
  sess := session.Must(session.NewSession())

  // Create a Lightsail client from just a session.
  clet := lightsail.New(sess, aws.NewConfig().WithRegion("ap-northeast-1") )

  // Create a InstancesInput.
  input := &lightsail.CreateInstancesInput{
    AvailabilityZone: aws.String("ap-northeast-1a"),
    BlueprintId: aws.String("ubuntu_16_04"),
    InstanceNames: []*string{
      aws.String("instance_go"),
    },
    BundleId: aws.String("nano_2_0"),
}

  // Create a lightsail instance.
  resp, err := clet.CreateInstances(input)
  if err != nil {
    fmt.Println(err)
    return
  }

  // Print response.
  fmt.Println(resp)
}


④実行

# go を実行する
$ go run newsail.go

# 出力結果
{
  Operations: [{
      CreatedAt: 2020-05-05 09:32:54 +0000 UTC,
      Id: "496b86d1-39f4-4de6-9cee-7403519de14f",
      IsTerminal: false,
      Location: {
        AvailabilityZone: "ap-northeast-1a",
        RegionName: "ap-northeast-1"
      },
      OperationType: "CreateInstance",
      ResourceName: "instance_go",
      ResourceType: "Instance",
      Status: "Started",
      StatusChangedAt: 2020-05-05 09:32:54 +0000 UTC
    }]
}


ポータルから見てみると・・・おお!できてるできてる。

f:id:dombri:20200505210507p:plain


まとめ

  • Amazon Lightsail は気軽にWebサービスを始められるサービス
    • 選択肢が限られているのでわかりやすいが、その分カスタマイズができない
    • 柔軟な設定をしたい場合や大規模システムの場合は Amazon EC2 が良さそう


思いがけず大作になってしまいました。GWで一番時間をかけたのが AWS × Go になるとは。

AWSはもちろん、今回のようなことがなかったらしばらくGo に触れなかったと思います。やってみて良かったですが、わからないことだらけで途中挫折しかけました。事前知識の準備は大事ですね・・・

プログラミングに限らずですが「結果(エラー)内容を出力する」ことの重要性も痛感しました。

エラーの吐き出し方が分からないまま go run して「実行はできてるけどインスタンスが一向に作成できない」が続き、てこずりました。結局配列の書き方などで複数文法ミスがあり、ほとんど書き直すことに。エラー様様です。

Go の文法は tour of Go や 書籍を読み進めて少しずつ覚えていこうと思います。

久しぶりにプログラミングもできて、大満足の一回めになりました。
(今のモチベーションとしてはAWSよりもGoやりたくなってしまった・・・)