AWS, EC2

EC2 Web API サーバー 構築

今回は、EC2のインスタンスにWebサーバーを構築して、
APIを実行できる様にするメモです。
簡単な確認用のWebAPIとしてKtor(Kotlin)を動作させてみます。

AWS infrastructure EC2 API example

また、全ての工程を手動で作業する内容になっています。
SSL化や独自ドメインの適応なども含まれません。動作させる最低限の内容になっています。
コストが発生しますし、セキュリティ設定も簡単な内容になっていますので、
参考にされる際は自己責任でお願い致します。
https://aws.amazon.com/jp/ec2/

環境・バージョン

OS:AmazonLinux2
Kotlin:2.0.20
JVM:17.0.12
Ktor:3.0.0
Gradle:8.4

VPC作成

今回はVPC作成から行います。

AWS infrastructure EC2 API example VPC

名前タグ名を指定して、IPv4 CIDRブロックを指定します。
IPv4 アドレスの範囲を手動で指定します。IPv6 CIDRブロックは今回は無しとします。

AWS infrastructure EC2 API example VPC

AWS infrastructure EC2 API example VPC

VPCが作成されたら、設定を編集します。

AWS infrastructure EC2 API example VPC

DNS設定のところで、DNSホスト名を有効化にチェックを入れて保存します。

AWS infrastructure EC2 API example VPC


パブリック・サブネット作成

サブネット作成

続けてサブネットを作成します。

AWS infrastructure EC2 API example VPC subnet

VPCは先ほど作成したものを選択します。

AWS infrastructure EC2 API example subnet

名称・アベイラビリティーゾーン・IPv4 CIDRブロックを指定していきます。
IPv4 VPC CIDR ブロックは、先ほど作成したVPCを選択します。

AWS infrastructure EC2 API example VPC subnet

AWS infrastructure EC2 API example VPC subnet

IPアドレス自動割り当ての設定

作成したサブネットの設定を変更します。

AWS infrastructure EC2 API example VPC auto dns

IPアドレスの自動割り当て設定を有効化します。

AWS infrastructure EC2 API example VPC dns


インターネットゲートウェイ作成

作成したVPCからインターネット接続できる様にするために、
インターネットゲートウェイも作成して設定します。

AWS infrastructure EC2 API example internet gateway

AWS infrastructure EC2 API example VPC internet gateway

 

 

AWS infrastructure EC2 API example VPC internet gateway

作成したら、画面上部にVPCへアタッチボタンが表示されると思いますので、ボタンを押します。

AWS infrastructure EC2 API example VPC internet gateway

作成したVPCを選択してアタッチします。

AWS infrastructure EC2 API example internet gateway

サブネット・ルートテーブル設定

インターネットゲートウェイをアタッチできたら、
サブネットのルートテーブルにもインターネットゲートウェイを設定します。
サブネットの詳細画面のルートテーブルのところに表示されているルートテーブルのIDをクリックすると、
調整したいルートテーブルを開くことができます。

AWS infrastructure EC2 API example route table internet gateway

先ほど作成したインターネットゲートウェイを指定します。
ここでは、指定する送信先IPを0.0.0.0にしていますが、
自身のIPなどに絞った方がセキュリティが向上します。

AWS infrastructure EC2 API example route table AWS infrastructure EC2 API example route table


EC2 インスタンス 作成

EC2インスタンスを作成します。

AWS infrastructure EC2 API example

AWS infrastructure EC2 API example

今回は、Amazon Linux2で作成します。
スペックも無料課金枠の対象のもので作成してみます。

AWS infrastructure EC2 API example

キーペアも必要に応じて作成 or 選択します。

AWS infrastructure EC2 API example

続けてネットワーク設定を行います。
ネットワーク設定は細かく設定したいので、編集ボタンを押します。

AWS infrastructure EC2 API example

VPC・サブネットを作成済みのものを選択します。
また、パブリックIPの自動割り当て有効化にします。

AWS infrastructure EC2 API example今回はセキュリティグループも新規作成します。  AWS infrastructure EC2 API example

インバウンドルールの設定は、今回は以下の内容で行います。
・タイプ:ssh、ポート範囲:22、ソースタイプ:自分のIPなど
・タイプ:カスタムTCP、ポート範囲:8080、ソースタイプ:0.0.0.0

sshは、EC2インスタンスに接続するための設定です。
sshのポート番号22は、デフォルト値な為あまり安全ではありません。
できれば任意の数値に変更してください。更に、自身や特定のIPからのみ許可した方が安全です。

また、APIの疎通用の設定も行なっておきます。
今回は、8080で行います。こちらもあまり安全ではありませんので、任意の数値に変更してください。
また、本来タイプの選択肢に存在するHTTPで設定したいところですが、ポート範囲を指定できないので、
今回は、カスタムにしてポートを8080に設定してみます。

AWS infrastructure EC2 API example

設定できたらインスタンスを起動します。


Ktor Webサービス 起動

EC2インスタンスが起動したら、
Webサーバーとして構築して起動します。

EC2 インスタンス SSH 接続

今回は、直接接続してサーバー内で作業します。

sshでアクセスするためのpemファイルを権限を調整します。

chmod 400 パス/pemファイル名
AWS infrastructure EC2 API example pem

その後、ssh接続します。

ssh -i pemファイル名 ec2-user@パブリックIPv4アドレス
パブリックIPv4アドレスは、EC2インスタンスの詳細タブで確認できます。

AWS infrastructure EC2 API example pem

今回は、パプリックIPアドレスの固定化などを行なっていないので、
設定変更や再起動を行うと変化します。逐一確認してください。

検証用 WebAPI 準備

Hello Worldの文字列だけが返却される、簡単なAPIだけが実装されているKtorプロジェクトです。
こちらをEC2にデプロイして動作させてみます。

AWS EC2 Web API example

Application.kt
起動するhttpサーバーのポート指定などが含まれます。
こちらの数値は、セキュリティグループのルールなどと合わせた数値を指定します。

package com.example

import com.example.plugins.*
import io.ktor.server.application.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*

fun main() {
    embeddedServer(Netty, port = 8080, host = "0.0.0.0", module = Application::module)
        .start(wait = true) }

fun Application.module() { configureRouting() }

Routing.kt

package com.example.plugins

import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*

fun Application.configureRouting() {
    routing {
        get("/") {
            call.respondText("Hello World!")
        }
    }
}

build.gradle.kts

val kotlin_version: String by project
val logback_version: String by project

plugins {
    kotlin("jvm") version "2.0.20"
    id("io.ktor.plugin") version "3.0.0-rc-2"
}

group = "com.example"
version = "0.0.1"

application {
    mainClass.set("com.example.ApplicationKt")

    val isDevelopment: Boolean = project.ext.has("development")
    applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment")
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("io.ktor:ktor-server-core-jvm")
    implementation("io.ktor:ktor-server-netty-jvm")
    implementation("ch.qos.logback:logback-classic:$logback_version")
    testImplementation("io.ktor:ktor-server-test-host-jvm")
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
}

yum最新化

sudo yum update -y

AWS EC2 API example

Javaインストール

sudo rpm --import https://yum.corretto.aws/corretto.key
sudo curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
sudo yum install -y java-17-amazon-corretto-devel
java -version

AWS EC2 API exampleAWS EC2 API example

Gradleインストール

wget https://services.gradle.org/distributions/gradle-8.4-bin.zip -P /tmp
sudo unzip -d /opt/gradle /tmp/gradle-8.4-bin.zip

Gradleインストール後は、環境変数にPATH追加します。

vi .bash_profile
export GRADLE_HOME=/opt/gradle/gradle-8.4
export PATH=${GRADLE_HOME}/bin:${PATH}
source .bash_profile gradle -v

Gitインストール・リポジトリクローン

gitをインストールして、ソースファイル等をチェックアウトします。

sudo yum install -y git
git clone https://github.com/iio1989/ktor-api-sample.git

ビルド

必要に応じてビルドを行います。

cd ktor-api-sample/
./gradlew build

サービス起動

cd ktor-api-sample/
./gradlew run

コンソールからログアウトする際にもサービスを維持したい時などには、以下などで実行します。

nohup ./gradlew run &

AWS EC2 API example

ブラウザ等でAPIを実行して挙動確認を行います。

AWS EC2 API example


今回のメモは以上となります。
コンテナなども使用せずに、手動でサーバーを整備していく内容になっているので手間がかかっています。
また、EC2インスタンスのIP固定なども行なっていないので、
設定変更や再起動を行うたびに、パブリックIPを確認する必要があるなど、
色々と調整の余地がある内容となっています。

今後その辺りなどもメモしていきたいと思います。

都内でエンジニアをやっています。 2017年に脱サラ(法人設立)しました。 仕事で調べたことや、気になったことをメモしています。
投稿を作成しました 172

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る