今回は、EC2のインスタンスにWebサーバーを構築して、
APIを実行できる様にするメモです。
簡単な確認用のWebAPIとしてKtor(Kotlin)を動作させてみます。
また、全ての工程を手動で作業する内容になっています。
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作成から行います。
名前タグ名を指定して、IPv4 CIDRブロックを指定します。
IPv4 アドレスの範囲を手動で指定します。IPv6 CIDRブロックは今回は無しとします。
VPCが作成されたら、設定を編集します。
DNS設定のところで、DNSホスト名を有効化にチェックを入れて保存します。
パブリック・サブネット作成
サブネット作成
続けてサブネットを作成します。
VPCは先ほど作成したものを選択します。
名称・アベイラビリティーゾーン・IPv4 CIDRブロックを指定していきます。
IPv4 VPC CIDR ブロックは、先ほど作成したVPCを選択します。
IPアドレス自動割り当ての設定
作成したサブネットの設定を変更します。
IPアドレスの自動割り当て設定を有効化します。
インターネットゲートウェイ作成
作成したVPCからインターネット接続できる様にするために、
インターネットゲートウェイも作成して設定します。
作成したら、画面上部にVPCへアタッチボタンが表示されると思いますので、ボタンを押します。
作成したVPCを選択してアタッチします。
サブネット・ルートテーブル設定
インターネットゲートウェイをアタッチできたら、
サブネットのルートテーブルにもインターネットゲートウェイを設定します。
サブネットの詳細画面のルートテーブルのところに表示されているルートテーブルのIDをクリックすると、
調整したいルートテーブルを開くことができます。
先ほど作成したインターネットゲートウェイを指定します。
ここでは、指定する送信先IPを0.0.0.0にしていますが、
自身のIPなどに絞った方がセキュリティが向上します。
EC2 インスタンス 作成
EC2インスタンスを作成します。
今回は、Amazon Linux2で作成します。
スペックも無料課金枠の対象のもので作成してみます。
キーペアも必要に応じて作成 or 選択します。
続けてネットワーク設定を行います。
ネットワーク設定は細かく設定したいので、編集ボタンを押します。
VPC・サブネットを作成済みのものを選択します。
また、パブリックIPの自動割り当ても有効化にします。
インバウンドルールの設定は、今回は以下の内容で行います。
・タイプ:ssh、ポート範囲:22、ソースタイプ:自分のIPなど
・タイプ:カスタムTCP、ポート範囲:8080、ソースタイプ:0.0.0.0
sshは、EC2インスタンスに接続するための設定です。
sshのポート番号22は、デフォルト値な為あまり安全ではありません。
できれば任意の数値に変更してください。更に、自身や特定のIPからのみ許可した方が安全です。
また、APIの疎通用の設定も行なっておきます。
今回は、8080で行います。こちらもあまり安全ではありませんので、任意の数値に変更してください。
また、本来タイプの選択肢に存在するHTTPで設定したいところですが、ポート範囲を指定できないので、
今回は、カスタムにしてポートを8080に設定してみます。
設定できたらインスタンスを起動します。
Ktor Webサービス 起動
EC2インスタンスが起動したら、
Webサーバーとして構築して起動します。
EC2 インスタンス SSH 接続
今回は、直接接続してサーバー内で作業します。
sshでアクセスするためのpemファイルを権限を調整します。
その後、ssh接続します。
今回は、パプリックIPアドレスの固定化などを行なっていないので、
設定変更や再起動を行うと変化します。逐一確認してください。
検証用 WebAPI 準備
Hello Worldの文字列だけが返却される、簡単なAPIだけが実装されているKtorプロジェクトです。
こちらをEC2にデプロイして動作させてみます。
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
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
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 &
ブラウザ等でAPIを実行して挙動確認を行います。
今回のメモは以上となります。
コンテナなども使用せずに、手動でサーバーを整備していく内容になっているので手間がかかっています。
また、EC2インスタンスのIP固定なども行なっていないので、
設定変更や再起動を行うたびに、パブリックIPを確認する必要があるなど、
色々と調整の余地がある内容となっています。
今後その辺りなどもメモしていきたいと思います。