寿司オーダーシステムのTerraform(AWS)
再利用可能にするため基本的に基本的にリソースはmoduleとして切り出します。
モジュールの分割は主に以下を意識しています
- 依存方向を一方向に
- 集約関係にあるものは一つのモジュールに
参考 terraform best practices Google Cloud - Terraform を使用するためのベスト プラクティス
tfstate 管理用の backend S3 バケットは terraform 管理化には置きません。./helpers/create-tfstate-bucket.sh
のスクリプトでバケットは作成します。
- 命名規則
- タグ名やリソース名はkebub-case
- bastion instance では SG の ingress を許可しない設計にしてます
- egress は許可しており、IGW のあるサブネットに置いているので
yum install
とかはできます - SSM session 経由で SSH を行います
- Session Manager を通して SSH 接続のアクセス許可を有効にして制御する
- SG のために terraform に自宅の IP アドレスを直書きする必要がないです
Host sushi-order-system-bastion
User ec2-user
ProxyCommand sh -c "aws ssm start-session --target $(aws ec2 describe-instances --filters 'Name=tag:Name,Values=%h' Name=instance-state-name,Values=running --query "Reservations[0].Instances[0].InstanceId" --output=text) --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
bastion server のインスタンス ID が確定したら $(aws ec2 describe-instances ...)
はインスタンス ID に置き換えても問題ありません。
PUBKEY_PATH
は登録する公開鍵へのパスを設定してください。
PUBKEY_PATH=~/.ssh/id_rsa.pub && \
BASTION=sushi-order-system-bastion && \
INSTANCE_ID=$(aws ec2 describe-instances --filters Name=tag:Name,Values=$BASTION Name=instance-state-name,Values=running --query "Reservations[0].Instances[0].InstanceId" --output=text) && \
aws ec2-instance-connect send-ssh-public-key \
--availability-zone ap-northeast-1a \
--instance-id $INSTANCE_ID \
--instance-os-user ec2-user \
--ssh-public-key file://$PUBKEY_PATH && \
ssh-copy-id -f -i $PUBKEY_PATH ec2-user@$BASTION && \
unset PUBKEY_PATH BASTION INSTANCE_ID
初回以外はこれだけで十分です。
ssh sushi-order-system-bastion
踏み台 EC2 サーバー上では以下を行います
- gitの環境構築
- deployments keyを利用して
sushi-order-system
をgit clone
- goの環境構築
bash_profile
でDB_HOST
,DB_PORT
,DB_USER
,DB_DATABASE
,DB_PASSWORD
などのDBの環境変数をexport
するように設定
sushi-order-system
ではsql-migrate
を利用してデータベースのmigrateを行います。
また、sushi-order-system
のリポジトリで用意されているMakefile
を利用します。
ssh sushi-order-system-bastion
で SSH 接続を行い、cd sushi-order-system
でカレントディレクトリを移動したら、以下のコマンドによりマイグレーションの実行を行います。
make migrate-up
なお、データベースの環境変数は、export
コマンドによりターミナル上で設定してください。
make seed
でテストデータを入れることが可能です。