diff --git a/README.md b/README.md new file mode 100644 index 0000000..ae4956b --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# public-ds-cluster-env +aws 환경 구축 시 사용하는 파일을 정리한다. + +## directory 구조 +1. docs: 문서파일 저장. +2. architecture : aws 구성도 +3. aws_image : aws AMI 이미지 생성 +4. aws_kubernetes : aws kubernetes 생성 (kops) +5. aws_network : aws network 구성 (terraform) +6. aws_total : aws 백업 파일 (kops) +7. script : support script diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/backup.tar.gz b/aws_kubernetes/aws_kops_prod/00_old/terraform/backup.tar.gz deleted file mode 100644 index dee52ea..0000000 Binary files a/aws_kubernetes/aws_kops_prod/00_old/terraform/backup.tar.gz and /dev/null differ diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/.terraform.lock.hcl b/aws_kubernetes/aws_kops_prod/terraform/.terraform.lock.hcl similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/.terraform.lock.hcl rename to aws_kubernetes/aws_kops_prod/terraform/.terraform.lock.hcl diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/00_terraform_var_change.sh b/aws_kubernetes/aws_kops_prod/terraform/00_terraform_var_change.sh similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/00_terraform_var_change.sh rename to aws_kubernetes/aws_kops_prod/terraform/00_terraform_var_change.sh diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/01_main.tf b/aws_kubernetes/aws_kops_prod/terraform/01_main.tf similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/01_main.tf rename to aws_kubernetes/aws_kops_prod/terraform/01_main.tf diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/02_nlb.tf b/aws_kubernetes/aws_kops_prod/terraform/02_nlb.tf similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/02_nlb.tf rename to aws_kubernetes/aws_kops_prod/terraform/02_nlb.tf diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/03_nlb_listener.tf b/aws_kubernetes/aws_kops_prod/terraform/03_nlb_listener.tf similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/03_nlb_listener.tf rename to aws_kubernetes/aws_kops_prod/terraform/03_nlb_listener.tf diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/04_nlb_target_group.tf b/aws_kubernetes/aws_kops_prod/terraform/04_nlb_target_group.tf similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/04_nlb_target_group.tf rename to aws_kubernetes/aws_kops_prod/terraform/04_nlb_target_group.tf diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/05_route53.tf b/aws_kubernetes/aws_kops_prod/terraform/05_route53.tf similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/05_route53.tf rename to aws_kubernetes/aws_kops_prod/terraform/05_route53.tf diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/99_variables.tf b/aws_kubernetes/aws_kops_prod/terraform/99_variables.tf similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/99_variables.tf rename to aws_kubernetes/aws_kops_prod/terraform/99_variables.tf diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/terraform.tfstate b/aws_kubernetes/aws_kops_prod/terraform/terraform.tfstate similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/terraform.tfstate rename to aws_kubernetes/aws_kops_prod/terraform/terraform.tfstate diff --git a/aws_kubernetes/aws_kops_prod/00_old/terraform/terraform.tfstate.backup b/aws_kubernetes/aws_kops_prod/terraform/terraform.tfstate.backup similarity index 100% rename from aws_kubernetes/aws_kops_prod/00_old/terraform/terraform.tfstate.backup rename to aws_kubernetes/aws_kops_prod/terraform/terraform.tfstate.backup diff --git a/scripts/kops_env/kops_env.sh b/scripts/kops_env/kops_env.sh new file mode 100755 index 0000000..80d929e --- /dev/null +++ b/scripts/kops_env/kops_env.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +export KOPS_STATE_STORE=s3://clusters.spot.datasaker.io +export KOPS_CLUSTER_NAME=k8s-spot.datasaker.io + +export VPC_ID="vpc-00ba2b0e9ad59f0ed " +export Network_CIDR="172.24.0.0/19" +export AMI_Image="ami-0abb33b73a78cae31" +export Private_Subnet_ID_1="subnet-024f0deda82039fa4" +export Private_Subnet_ID_2="subnet-050d942fa1c46540a" +export Private_Subnet_ID_3="subnet-0946eb806af7377be" +export Public_Subnet_ID_1="subnet-00c363356f133411d" +export Public_Subnet_ID_2="subnet-07aa5e879a262014d" +export Public_Subnet_ID_3="subnet-0073a61bc56a68a3e" + +kops_cmd=""" +kops create cluster \ + --vpc "$VPC_ID" \ + --cloud aws \ + --ssh-public-key "$HOME/.ssh/id_rsa.pub" \ + --topology private --kubernetes-version "1.25.2" \ + --network-cidr "$Network_CIDR" \ + --networking calico \ + --container-runtime containerd \ + --image $AMI_Image \ + --zones ap-northeast-2a,ap-northeast-2b,ap-northeast-2c \ + --master-count 3 \ + --master-size t3.small \ + --node-count 3 \ + --node-size t3.small \ + --node-volume-size 100 \ + --subnets "$Private_Subnet_ID_1,$Private_Subnet_ID_2,$Private_Subnet_ID_3" \ + --utility-subnets "$Public_Subnet_ID_1,$Public_Subnet_ID_2,$Public_Subnet_ID_3" \ + -v 10 +""" + +kubeconfig="kops export kubecfg --admin --kubeconfig $HOME/.kube/config --name=${KOPS_CLUSTER_NAME} --state=${KOPS_STATE_STORE}" +echo ${kubeconfig} +echo +echo +echo ${kops_cmd} diff --git a/scripts/spot_lambda/lambda_restart.sh b/scripts/spot_lambda/lambda_restart.sh new file mode 100755 index 0000000..2e4b800 --- /dev/null +++ b/scripts/spot_lambda/lambda_restart.sh @@ -0,0 +1,102 @@ +if [ -z "$BASH_VERSION" ]; then exec bash "$0" "$@"; exit; fi + +#---------------------------------------------------------------------------------------------------------------- +# 변수 선언 +echo_line="==========================================================================" +search_tag="spot" +stop_function="spot_stop" +start_function="spot_start" + +#---------------------------------------------------------------------------------------------------------------- +# aws 인스턴스 조회 +_get_aws_status (){ + aws_query="Reservations[].Instances[].[ InstanceId, Tags[?Key=='Name'].Value|[0] ]" + aws_filter="Name=instance-state-name,Values=running" + current_ec2_num=`aws ec2 describe-instances --query "${aws_query}" --filter ${aws_filter} --output text | grep ${search_tag} | wc -l` +} + +#---------------------------------------------------------------------------------------------------------------- +# log 출력 +_get_time_log (){ + datetime=`date +'%Y-%m-%d %H:%M:%S'` + string=$1 + echo "[${datetime}] ${string}" +} + +#---------------------------------------------------------------------------------------------------------------- +# aws lambda 실행 후 인스턴스 조회하여 성공/실패 여부 체크 + +_main (){ + lambda_function=$1 + echo ${echo_line} + if [[ ${lambda_fuction} == *"stop"* ]]; then + what_func='stop' + else + what_func='start' + fi + + _get_time_log "[INFO] aws lambda ${lambda_function} start" + + aws lambda invoke --function-name ${lambda_function} --cli-binary-format raw-in-base64-out --payload '{ "key": "value" }' response.json > /tmp/aws_func_result + #echo "aws lambda invoke --function-name ${lambda_function} --cli-binary-format raw-in-base64-out --payload '{ "key": "value" }' response.json" + + succ_flag=0 + while read line + do + if [[ $line == *"200"* ]]; then + succ_flag=1 + _get_time_log "[INFO] aws lambda ${lambda_function} success!" + break + else + succ_flag=0 + fi + done < /tmp/aws_func_result + + if [[ ${succ_flag} == 1 ]]; then + aws lambda invoke --function-name ${lambda_function} out --log-type Tail --query 'LogResult' --output text | base64 -d > /tmp/aws_func_output + if [[ ${what_func} == 'stop' ]]; then + final_ec2_num=0 + else + final_ec2_num=`grep "Starting" /tmp/aws_func_output | wc -l` + fi + + num=0 + while true + do + _get_aws_status + num=`echo $(( $num + 1 ))` + if [[ ${current_ec2_num} == ${final_ec2_num} ]]; then + _get_time_log "[INFO] aws ${search_tag} instance number: ${final_ec2_num} check success!" + break + elif [[ ${num} == 30 ]]; then + _get_time_log "[Error] time out!" + break + else + _get_time_log "[Retry: ${num}] aws ${search_tag} instance number: ${final_ec2_num} checking..." + fi + sleep 5 + done + else + echo ${echo_line} + _get_time_log "[Error] aws lambda ${lambda_function} failed!" + exit + fi + echo ${echo_line} + #--------------- + +} +#---------------------------------------------------------------------------------------------------------------- +# 실행 + +_main ${stop_function} + +_main ${start_function} + +#---------------------------------------------------------------------------------------------------------------- +# 임시 파일 삭제 + +unlink out +unlink response.json +unlink /tmp/aws_func_output +unlink /tmp/aws_func_result +#---------------------------------------------------------------------------------------------------------------- diff --git a/scripts/spot_lambda/lambda_stop.sh b/scripts/spot_lambda/lambda_stop.sh new file mode 100755 index 0000000..b8be4fd --- /dev/null +++ b/scripts/spot_lambda/lambda_stop.sh @@ -0,0 +1,100 @@ +if [ -z "$BASH_VERSION" ]; then exec bash "$0" "$@"; exit; fi + +#---------------------------------------------------------------------------------------------------------------- +# 변수 선언 +echo_line="==========================================================================" +search_tag="spot" +stop_function="spot_stop" +start_function="spot_start" + +#---------------------------------------------------------------------------------------------------------------- +# aws 인스턴스 조회 +_get_aws_status (){ + aws_query="Reservations[].Instances[].[ InstanceId, Tags[?Key=='Name'].Value|[0] ]" + aws_filter="Name=instance-state-name,Values=running" + current_ec2_num=`aws ec2 describe-instances --query "${aws_query}" --filter ${aws_filter} --output text | grep ${search_tag} | wc -l` +} + +#---------------------------------------------------------------------------------------------------------------- +# log 출력 +_get_time_log (){ + datetime=`date +'%Y-%m-%d %H:%M:%S'` + string=$1 + echo "[${datetime}] ${string}" +} + +#---------------------------------------------------------------------------------------------------------------- +# aws lambda 실행 후 인스턴스 조회하여 성공/실패 여부 체크 + +_main (){ + lambda_function=$1 + echo ${echo_line} + if [[ ${lambda_fuction} == *"stop"* ]]; then + what_func='stop' + else + what_func='start' + fi + + _get_time_log "[INFO] aws lambda ${lambda_function} start" + + aws lambda invoke --function-name ${lambda_function} --cli-binary-format raw-in-base64-out --payload '{ "key": "value" }' response.json > /tmp/aws_func_result + #echo "aws lambda invoke --function-name ${lambda_function} --cli-binary-format raw-in-base64-out --payload '{ "key": "value" }' response.json" + + succ_flag=0 + while read line + do + if [[ $line == *"200"* ]]; then + succ_flag=1 + _get_time_log "[INFO] aws lambda ${lambda_function} success!" + break + else + succ_flag=0 + fi + done < /tmp/aws_func_result + + if [[ ${succ_flag} == 1 ]]; then + aws lambda invoke --function-name ${lambda_function} out --log-type Tail --query 'LogResult' --output text | base64 -d > /tmp/aws_func_output + if [[ ${what_func} == 'stop' ]]; then + final_ec2_num=0 + else + final_ec2_num=`grep "Starting" /tmp/aws_func_output | wc -l` + fi + + num=0 + while true + do + _get_aws_status + num=`echo $(( $num + 1 ))` + if [[ ${current_ec2_num} == ${final_ec2_num} ]]; then + _get_time_log "[INFO] aws ${search_tag} instance number: ${final_ec2_num} check success!" + break + elif [[ ${num} == 30 ]]; then + _get_time_log "[Error] time out!" + break + else + _get_time_log "[Retry: ${num}] aws ${search_tag} instance number: ${final_ec2_num} checking..." + fi + sleep 5 + done + else + echo ${echo_line} + _get_time_log "[Error] aws lambda ${lambda_function} failed!" + exit + fi + echo ${echo_line} + #--------------- + +} +#---------------------------------------------------------------------------------------------------------------- +# 실행 + +_main ${stop_function} + +#---------------------------------------------------------------------------------------------------------------- +# 임시 파일 삭제 + +unlink out +unlink response.json +unlink /tmp/aws_func_output +unlink /tmp/aws_func_result +#----------------------------------------------------------------------------------------------------------------