IT・ビッグデータ徒然ブログ

関西でインフラ、データ基盤系のエンジニアになりたい

起動させるたびにIPが変わって鬱陶しいあれをなるべくお金をかけずに解決する

前ふり

AWSクラウドでサーバを立てる時に気になるお金。
なるべく課金を減らすために必要なときだけ立てて、いらなければ落とすなんてことをしますよね。
でも落とした後に起動するとやっかいなのがIPアドレスの変更。
毎回毎回アドレスが変わってしまうとssh config等の設定を変えないといけなかったりして面倒なんですよね。
かといってElasticなIPを使うとそれでもお金がかかってしまうので嫌だ。。。
というわけで、なるべくお金をかけずにかつ設定をなるべく変えないでサーバを扱う方法を紹介します。
※今回の例はあくまで検証や遊びでサーバを立てて使う人用の方法です。本番システムでの利用は推奨しません。

やること

  • VPCを作成
  • パブリックサブネットとプライベートサブネットを立てる
  • インターネットからパブリックサブネットにアクセスさせる設定
  • パブリックサブネットに踏み台サーバを立てる
  • プライベートサブネットに検証サーバを立てる
  • ssh configで踏み台経由でサーバにアクセスする設定を行う
  • ssh <設定名>でいつでもアクセスできるWHYYYYYYY
    やっていることのほとんどはAWSEC2のデザインパターンとかでよくみるやつです。

VPCの作成

まずは、VPCを作成します。
AWSのユーザーコンソールからVPCに移動

設定項目 設定値
名前タグ 適当な名前で
IPv4 CIDRブロック なんでもいいけどVPCにいっぱいサーバを立てるなら10.0.0.0/16が順当かと
IPv6 CIDRブロック ブロックはなしで
テナンシー デフォルトでOK

パブリックサブネットとプライベートサブネットを立てる

続いてサブネットを作ります。
ユーザーコンソールからVPC -> サブネットに移動。
サブネットではインターネット経由でアクセスできるパブリックサブネットとプライベートサブネットを設定します。

  • パブリックサブネット側
設定項目 設定値
名前タグ 適当な名前で
VPC さっき作成したVPC名を指定
アベイラビリティーゾーン 今回は特に指定なしでOK
IPv4 CIDRブロック VPCで設定したブロック内で範囲を指定。今回は10.0.1.0/24としておく。
  • プライベートサブネット側
設定項目 設定値
名前タグ 適当な名前で
VPC さっき作成したVPC名を指定
アベイラビリティーゾーン 今回は特に指定なしでOK
IPv4 CIDRブロック VPCで設定したブロック内で範囲を指定。今回は10.0.2.0/24としておく。

インターネットからパブリックサブネットにアクセスさせる設定

ここは大事なところ。 2つサブネットを作成した後に、パブリックサブネットのみ選択して、サブネットのアクション-> 自動割り当てIPの設定変更 に飛ぶ
そこで、 パブリックIPv4アドレスの自動割り当てを有効にする にチェック。
これをやっとかないと踏み台サーバ立てても外部からサーバにアクセスするための外部IPを発行してくれません。

次にやるのはインターネットとパブリックサブネットをつなぐゲートウェイ(窓口みたいなもの)の設定

  1. VPC -> インターネットゲートウェイに移動
  2. インターネットゲートウェイの作成を押して文字通り作成(名前は適当に)
  3. さっき作ったゲートウェイを選択して、 アクション->VPCのアタッチを選択
  4. VPCでさっき作ったVPCを選択してアタッチ
  5. VPC -> ルートテーブルに移動
  6. 作ったVPCに紐づくルートテーブルを選択。
  7. 下部にあるルートタブを選択して編集。
  8. 別のルートを追加を選択。以下のように設定
送信先 ターゲット
0.0.0.0/0 さっき作ったゲートウェイの名前

これでできました。

パブリックサブネットに踏み台サーバを立てる

ここから踏み台サーバを立てます。
サーバの立て方は基本的な方法と同じなので割愛。
一般的な立て方と違うのは以下の点。 + インスタンスのタイプはt2.nano(踏み台用途なので and 24時間稼働を想定してなるべくお金がかからないように) + インスタンスの詳細の設定にて + ネットワーク -> 作ったVPCの名前 + サブネット -> パブリックサブネットの名前

プライベートサブネットに検証サーバを立てる

今度はプライベート側に実際に使用するサーバを立てます。
こちらも基本的な立て方は同じ。
変更点は以下の点 + インスタンスの詳細の設定にて + ネットワーク -> 作ったVPCの名前 + サブネット -> プライベートサブネットの名前 + セキュリティグループは基本的に全開放でも問題ないが、気にされる方は必要なポートをパブリックサブネットのIPに指定するとよし。

ssh configで踏み台経由でサーバにアクセスする設定を行う

サーバが立てられたので、sshでつなぐ設定をします。 今回はmacを想定し、macの.ssh/configに設定をします。

# ~/.ssh/config
Host humidai
        HostName <踏み台サーバのパブリックIP>
        User ubuntu #サーバによって変化
    Port 22 #sshポート
        GatewayPorts yes
        IdentityFile ローカルマシン内で踏み台サーバの公開鍵が置いてある場所

Host server
        HostName <10.0.2.xxとなるIP>
        User ec2-user #サーバによって変化
        Port 22
        GatewayPorts yes
        ProxyCommand ssh -CW %h:%p humidai #humidaiは上記設定したHostの名前を指定
        IdentityFile ローカルマシン内で検証サーバの公開鍵が置いてある場所

# ProxtCommandが踏み台サーバ経由でsshサクセスさせるためのコマンド

この設定をした後、

ssh server

とコマンドを入力すると、踏み台経由でアクセスできます。
しかも、検証サーバを一旦落として再度あげてもプライベートIPは変わらないので、そのままsshコマンドで入れます。
また、ポートフォワーディングしたい場合は、

# ~/.ssh/config

#踏み台側
   LocalForward 5432 localhost:5432
      LocalForward 8080 localhost:8080
#サーバ側
        LocalForward 5432 <サーバのプライベートIP>:5432
        LocalForward 8080 <サーバーのプライベートIP>:8080

と設定すればOK

懸念事項

  1. この構成にすると、サーバ側からインターネットにつなぐことができないので、wgetとかでファイルを落としたりすることはできません。
    これについては別途NATインスタンスとかNATゲートウェイが必要になるのですが、いずれにしてもお金がかかる。。。。
    なので、しょっちゅうインターネットにアクセスしないのであれば、ローカルマシンに対象ファイルを落としてscpコマンドで移動がよいかなと。
    実際scpコマンドで移動させる場合でも
scp <移動させるファイル> server:/home/ec2-user

みたいな感じで簡単に移動できます。

  1. この構成は踏み台サーバは常時稼働を想定しています。踏み台サーバはt2.nanoの最小構成なので、
    $0.0058 /1 時間 -> 500円くらい/1ヶ月
    が必要経費になります。

ただ、毎回毎回IPアドレスを変える手間とか、めんどくさくてサーバをずっと起動させることによる課金等を考えると決して高い値段ではないかなと。

終わりに

今回は最近良くやるAWSでの検証サーバ構築用のシステムを紹介しました。
上述したように、この構成は本番構成でもやるような部分も含まれていますので、特にAWS初心者の方はぜひチャレンジしてみるといいかもしれません。

ホントの最後に

間違いとか、わからないとこがあればコメントとかしていただければ!!

Lambdaで署名付きURLを生成する方法(2018年3月)

以前からちょくちょく署名付きURLを作成していたのですが、それを久々に使ったところ、
なぜかエラーがでてたので、今の時点で使えるようにアップデートしました。

同じ情報はググればいっぱい出てくるのですが、どこも中途半端だったり、わかりにくかったりするので、
ここではURLが生成されるならよいという仕様で行きます。

環境

コード

#下2行は決まり文句的なもの
import boto3
def lambda_handler(event, context):

#BUCKET = '<バケット名>'
#KEY = '<ファイル名(パス含む)>'

  BUCKET = 'hogehoge'
  KEY = 'foo/bar.jpg'

  s3 = boto3.client('s3')

#URLを生成
#ExpiresInでURLの有効期限を設定

  url =  s3.generate_presigned_url(
      ClientMethod = 'get_object',
      Params = {'Bucket' : BUCKET, 'Key' : KEY},
      ExpiresIn = 604800,
      HttpMethod = 'GET'
  )

#生成したURLを出力
  print (url)   

    

注意点

  • 冒頭の決まり文句的なものが入っているか
  • インデントがきちんとされているか(カッコとセミコロンの後は特に注意)

うまくいかなかったらコメントくださいな。

自己紹介的な

はじめまして。

今更ながら技術ブログをはじめてみることにしました。

普段は主にBI・DWH界隈に生息しており、
ツールの導入支援、レポート開発(JavaJavascript等)、DWH設計ならびにETL構築支援等コンサルを主に行っています。

また並行してビッグデータがらみの調査・検証もしており、
主に分散システム(Hadoop、Spark、Kafka)あたりが最近のマイブームです。

このブログではそうした日々の何気ないことから発見した技術的なTipsや
技術本の感想みたいなものを行っていこうと考えています。

技術的興味関心キーワード