Giter Club home page Giter Club logo

griffin-springboot2-webservice's Introduction

Springboot + AWS Study Project ๐Ÿ’ป

์ฐธ๊ณ  : ์Šคํ”„๋ง๋ถ€ํŠธ์™€ AWS๋กœ ํ˜ผ์ž ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค (ํ”„๋ฆฌ๋ ‰ / ์ด๋™์šฑ ์ง€์Œ)

INDEX

  • ์Šคํ”„๋ง ๋ถ€ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
  • JPA๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‹ค๋ฃจ๊ธฐ
  • Mustache ํ™”๋ฉด๊ตฌ์„ฑ
  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์™€ OAuth2.0 ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ
  • AWS ์„œ๋ฒ„ํ™˜๊ฒฝ - AWS EC2
  • AWS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šคํ™˜๊ฒฝ - AWS RDS
  • EC2 ์„œ๋ฒ„์— ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ
  • Travis CI ๋ฐฐํฌ ์ž๋™ํ™”
  • ๋ฌด์ค‘๋‹จ์„œ๋น„์Šค

AWS EC2

  • EC2 : Elastic Compute Cloud (AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ์„ฑ๋Šฅ, ์šฉ๋Ÿ‰ ๋“ฑ์„ ์œ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„)
  • 1๋Œ€์˜ t2.micro๋งŒ ์‚ฌ์šฉํ•˜๋ฉด 24์‹œ๊ฐ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  1. ์„œ์šธ ๋ฆฌ์ „ ์„ ํƒ
  2. EC2 ์ธ์Šคํ„ด์Šค ์‹œ์ž‘
  3. AMI (Amazon Machine Image) ์„ ํƒ > Amazon Linux AMI
    EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด ๋‘” ๊ฒƒ
  4. ์Šคํ† ๋ฆฌ์ง€ : 30GB ๊นŒ์ง€ ํ”„๋ฆฌํ‹ฐ์–ด๋กœ ๊ฐ€๋Šฅ
  5. ํƒœ๊ทธ : ์›น ์ฝ˜์†”์—์„œ ํ‘œ๊ธฐ๋  ํƒœ๊ทธ์ธ Name ํƒœ๊ทธ๋ฅผ ๋“ฑ๋ก (๋ณธ์ธ ์„œ๋น„์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ’)
  6. ๋ฐฉํ™”๋ฒฝ : SSH (AWS EC2 ์— ํ„ฐ๋ฏธ๋„๋กœ ์ ‘์† ) > ๋ณธ์ธ IP์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•จ
  • EIP (Elasic IP, AWS์˜ ๊ณ ์ •IP) ํ• ๋‹นํ›„ ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ฒฐ

EC2 ์„œ๋ฒ„ ์ ‘์†

ssh -i {pem ํ‚ค ์œ„์น˜} {EC2์˜ ํƒ„๋ ฅ์  IP์ฃผ์†Œ}
  • ์†์‰ฝ๊ฒŒ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๊ธฐ

~/.ssh ๋กœ pem ํŒŒ์ผ ์ด๋™ > ssh ์‹คํ–‰์‹œ ์ž๋™์œผ๋กœ ์ฝ์–ด ์ ‘์†

cp pem {pem ํ‚ค ์œ„์น˜} ~/.ssh/
ll ~/.ssh/

pem ํ‚ค ๊ถŒํ•œ ๋ณ€๊ฒฝ

chmod 600 ~/.ssh/pemํ‚ค์ด๋ฆ„

pem ํ‚ค๊ฐ€ ์žˆ๋Š” ~/.ssh ๋””๋ ‰ํ† ๋ฆฌ์— config ํŒŒ์ผ ์ƒ์„ฑ

vim ~/.ssh/config
# griffin-springboot2-webservice
Host ์›ํ•˜๋Š”์„œ๋น„์Šค๋ช…
    HostName ec2์˜ ํƒ„๋ ฅ์ IP์ฃผ์†Œ
    User ec2-user
    IdentityFile ~/.ssh/pemํ‚ค ์ด๋ฆ„

config ํŒŒ์ผ ์‹คํ–‰๊ถŒํ•œ ์„ค์ •

chmod 700 ~/.ssh/config

ec2 ์ ‘์†ํ•˜๊ธฐ

ssh {config์— ๋“ฑ๋กํ•œ ์„œ๋น„์Šค๋ช…}

1. Java 8 ์„ค์น˜

sudo yum install -y java-1.8.0-openjdk-devel.x86_64

์ธ์Šคํ„ด์Šค์˜ Java ๋ฒ„์ „์„ 8๋กœ ๋ณ€๊ฒฝ

sudo /usr/sbin/alternatives --config java

๋ถˆํ•„์š”ํ•œ java ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ

sudo yum remove java-1.7.0-openjdk

java ๋ฒ„์ „ ํ™•์ธ

java -version

2. ํƒ€์ž„์กด๋ณ€๊ฒฝ

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

date

3. ํ˜ธ์ŠคํŠธ๋„ค์ž„ ๋ณ€๊ฒฝ

๊ฐ ์„œ๋ฒ„๊ฐ€ ์–ด๋Š ์„œ๋น„์Šค์ธ์ง€ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด HOSTNAME ์„ ๋ณ€๊ฒฝ

sudo vim /etc/sysconfig/network

HOSTNAME ์œผ๋กœ ๋˜์–ด์žˆ๋Š” ๋ถ€๋ถ„์„ ์›ํ•˜๋Š” ์„œ๋น„์Šค๋ช…์œผ๋กœ ๋ณ€๊ฒฝ

HOSTNAME=griffin-springboot2-webservice

/etc/hosts ์— ๋ณ€๊ฒฝํ•œ hostname ๋“ฑ๋ก

sudo vim /etc/hosts

127.0.0.1  ๋“ฑ๋กํ•œHOSTNAME

curl ๋“ฑ๋กํ•œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„

AWS RDS

1. RDS ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜๊ธฐ

  1. DBMS - MariaDB ์„ ํƒ
  2. ํ…œํ”Œ๋ฆฟ - ํ”„๋ฆฌํ‹ฐ์–ด
  3. ๋„คํŠธ์›Œํฌ - ํผ๋ธ”๋ฆญ ์—‘์„ธ์Šค ๊ธฐ๋Šฅ on (์ง€์ •๋œ IP๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œ์–ด)

2. RDS ์šด์˜ํ™˜๊ฒฝ์— ๋งž๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •

  1. ํƒ€์ž„์กด - Asia/Seoul
  2. Character Set (utf8mb4 / utf8mb4_general_ci๋กœ ์„ค์ •)
  • character_set_client
  • character_set_connection
  • character_set_database
  • character_set_filesystem
  • character_set_results
  • character_set_server
  • collation_connection
  • collation_server
  1. Max Connection (150์œผ๋กœ ์„ค์ •)

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€๊ฒฝ ํ›„, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ต์…˜ ์ˆ˜์ • (DB ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน) / ์žฌ๋ถ€ํŒ…

3. ๋‚ด PC ์—์„œ RDS ์ ‘์†

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณด์•ˆ๊ทธ๋ฃน ์„ ํƒ
  2. EC2์— ์‚ฌ์šฉ๋œ ๋ณด์•ˆ๊ทธ๋ฃน์˜ ๊ทธ๋ฃนID ๋ฅผ RDS ๋ณด์•ˆ๊ทธ๋ฃน์˜ ์ธ๋ฐ”์šด๋“œ๋กœ ์ถ”๊ฐ€
    MYSQL/Aurora | TCP | 3306 | ์‚ฌ์šฉ์ž์ง€์ • | {EC2 ๋ณด์•ˆ๊ทธ๋ฃนID}
    MYSQL/Aurora | TCP | 3306 | ๋‚ด IP | {๋‚ด IP}
  3. Database ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ (RDS์ •๋ณด ํŽ˜์ด์ง€์—์„œ ์—”๋“œํฌ์ธํŠธ ํ™•์ธ)
use griffin_springboot_webserivce;

show variables like 'c%';

alter database griffin_springboot_webserivce
CHARACTER SET = 'utf8mb4'
COLLATE = 'utf8mb4_general_ci'
;

select @@time_zone, now();

CREATE TABLE TEST (
    id bigint(20) not null auto_increment,
    content varchar(255) default null,
    primary key (id)
) engine = InnoDB;

insert into TEST(content) value ('ํ…Œ์ŠคํŠธ');

select * from TEST;

4. EC2 ์—์„œ RDS ์ ‘๊ทผ ํ™•์ธ

EC2 ์— MySQL CLI ์„ค์น˜

ssh griffin-springboot2-webservice

sudo yum install mysql

mysql -u ๊ณ„์ • -p -h Host์ฃผ์†Œ

mysql> show databases;
+-------------------------------+
| Database                      |
+-------------------------------+
| griffin_springboot_webserivce |
| information_schema            |
| innodb                        |
| mysql                         |
| performance_schema            |
| test                          |
+-------------------------------+
6 rows in set (0.00 sec)

EC2 ์„œ๋ฒ„์— ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ

1. EC2 ์— ํ”„๋กœ์ ํŠธ clone

# git ์„ค์น˜
sudo yum install git
git --version

# ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mkdir ~/app && mkdir ~/app/step1
cd ~/app/step1

# git clone
git clone ํ”„๋กœ์ ํŠธ์ฃผ์†Œ
  • ํ…Œ์ŠคํŠธ์ˆ˜ํ–‰
./gradlew test

์„ฑ๊ณต

BUILD SUCCESSFUL in 2m 26s
5 actionable tasks: 5 executed

์‹คํŒจ : -bash: ./gradlew: Permission denied

# ์‹คํ–‰ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•œ ๋’ค ๋‹ค์‹œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
chmod +x ./gradlew

2. ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ๋งŒ๋“ค๊ธฐ

~/app/step1/deploy.sh

REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=griffin-springbbot2-webservice

cd /$REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"
git pull

echo "> ํ”„๋กœ์ ํŠธ Build ์‹œ์ž‘"
./gradlew build

echo "> step1 ๋””๋ ‰ํ† ๋ฆฌ ์ด๋™"
cd $REPOSITORY

echo "> Build ํŒŒ์ผ ๋ณต์‚ฌ"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ pid ํ™•์ธ"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

echo "> ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ pid : $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
	echo "> ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."
else
	echo "> kill -15 $CURRENT_PID"
	kill -15 $CURRENT_PID
	sleep 5
fi

echo "> ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

# nohup : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์ž๊ฐ€ ํ„ฐ๋ฏธ๋„์„ ์ข…๋ฃŒํ•ด๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ณ„์† ๊ตฌ๋™

deploy.sh ์‹คํ–‰๊ถŒํ•œ ์ถ”๊ฐ€ ๋ฐ ์‹คํ–‰

chmod +x ./deploy.sh

./deploy.sh

> Git Pull
์ด๋ฏธ ์—…๋ฐ์ดํŠธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
> ํ”„๋กœ์ ํŠธ Build ์‹œ์ž‘

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/4.10.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 4s
6 actionable tasks: 1 executed, 5 up-to-date
> step1 ๋””๋ ‰ํ† ๋ฆฌ ์ด๋™
> Build ํŒŒ์ผ ๋ณต์‚ฌ
> ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ pid ํ™•์ธ
> ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ pid : 
> ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
> ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ
> JAR Name: griffin-springboot2-webservice-1.0-SNAPSHOT.jar

์™ธ๋ถ€ Security ํŒŒ์ผ ๋“ฑ๋กํ•˜๊ธฐ

  • ClientId ์™€ ClientSecret ์„ค์ •์„ ์„œ๋ฒ„์— ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ๋„๋ก ์„ค์ •
vim /home/ec2-user/app/application-oauth.properties

# deploy ์ˆ˜์ •
nohup java -jar \-Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties \/$REPOSITORY/$JAR_NAME 2>&1 &

3. ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋กœ RDS ์ ‘๊ทผํ•˜๊ธฐ

  1. ํ…Œ์ด๋ธ” ์ƒ์„ฑ
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ด๋ธ”
Hibernate: create table posts (id bigint not null auto_increment, created_date datetime, modified_date datetime, author varchar(255), content TEXT not null, title varchar(500) not null, primary key (id)) engine=InnoDB
Hibernate: create table user (id bigint not null auto_increment, created_date datetime, modified_date datetime, email varchar(255) not null, name varchar(255) not null, picture varchar(255), role varchar(255) not null, primary key (id)) engine=InnoDB

# ์Šคํ”„๋ง ์„ธ์…˜ ํ…Œ์ด๋ธ” (schema-mysql.sql)
CREATE TABLE SPRING_SESSION (
                                PRIMARY_ID CHAR(36) NOT NULL,
                                SESSION_ID CHAR(36) NOT NULL,
                                CREATION_TIME BIGINT NOT NULL,
                                LAST_ACCESS_TIME BIGINT NOT NULL,
                                MAX_INACTIVE_INTERVAL INT NOT NULL,
                                EXPIRY_TIME BIGINT NOT NULL,
                                PRINCIPAL_NAME VARCHAR(100),
                                CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);

CREATE TABLE SPRING_SESSION_ATTRIBUTES (
                                           SESSION_PRIMARY_ID CHAR(36) NOT NULL,
                                           ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
                                           ATTRIBUTE_BYTES BLOB NOT NULL,
                                           CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
                                           CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
  1. ํ”„๋กœ์ ํŠธ ์„ค์ •

build.gradle ์— MariaDB ๋“œ๋ผ์ด๋ฒ„ ๋“ฑ๋ก

compile('org.mariadb.jdbc:mariadb-java-client')

application-real.properties ์ถ”๊ฐ€

spring.profiles.include=oauth.real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
  1. EC2 ์„ค์ •

app ๋””๋ ‰ํ† ๋ฆฌ์— application-real-db.properties ์ƒ์„ฑ

vim ~/app/application-real-db.properties

# JPA ๋กœ ํ…Œ์ด๋ธ”์ด ์ž๋™์ƒ์„ฑ๋˜๋Š” ์˜ต์…˜์„ none ์„ค์ • (RDS๋Š” ์‹ค์ œ ์šด์˜ ํ…Œ์ด๋ธ”์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ ์ƒˆ๋กœ ๋งŒ๋“ค๋ฉด ์•ˆ๋จ)
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://{rds์ฃผ์†Œ}:{port}/{database๋ช…}
spring.datasource.username=db๊ณ„์ •
spring.datasource.password=db๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

deploy.sh ์ˆ˜์ • (real profile ์‚ฌ์šฉ)

nohup java -jar \-Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties,classpath:/application-real.properties \-Dspring.profiles.active=real \/$REPOSITORY/$JAR_NAME 2>&1 &

4. EC2 ์†Œ์…œ๋กœ๊ทธ์ธ

  1. AWS ๋ณด์•ˆ๊ทธ๋ฃน ๋ณ€๊ฒฝ

EC2 ๋ณด์•ˆ๊ทธ๋ฃน์— 8080 ํฌํŠธ๊ฐ€ ์—ด๋ ค์žˆ๋Š”์ง€ ํ™•์ธ

  1. Google ์— EC2 ์ฃผ์†Œ ๋“ฑ๋ก

๊ตฌ๊ธ€์›น์ฝ˜์†” (https://console.cloud.google.com/home/dashboard)
API ๋ฐ ์„œ๋น„์Šค > ์‚ฌ์šฉ์ž์ธ์ฆ์ •๋ณด

  • OAuth ๋™์˜ ํ™”๋ฉด > ์Šน์ธ๋œ ๋„๋ฉ”์ธ

http:// ์—†์ด EC2 ํผ๋ธ”๋ฆญ DNS ๋“ฑ๋ก

  • ์‚ฌ์šฉ์ž์ธ์ฆ์ •๋ณด > ์„œ๋น„์Šค ์„ ํƒ

ํผ๋ธ”๋ฆญ DNS ์ฃผ์†Œ์— {ํผ๋ธ”๋ฆญ}:8080/login/oauth2/code/google ์Šน์ธ๋œ ๋ฆฌ๋””๋ ‰์…˜ URL ๋“ฑ๋ก

  1. Naver ์— EC2 ์ฃผ์†Œ ๋“ฑ๋ก

๋„ค์ด๋ฒ„ ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ (https://developers.naver.com/apps/#/myapps)

  • ์„œ๋น„์Šค URL

๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ๋„ค์ด๋ฒ„์— ๋“ฑ๋ก๋œ ์„œ๋น„์Šค์ธ์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ํ•ญ๋ชฉ 8080 ํฌํŠธ๋Š” ์ œ์™ธํ•˜๊ณ  ์‹ค์ œ ๋„๋ฉ”์ธ ์ฃผ์†Œ๋งŒ ์ž…๋ ฅ 1๊ฐœ์˜ ์ฃผ์†Œ๋งŒ ํ—ˆ์šฉ (์ˆ˜์ • ํ›„ localhost ์‚ฌ์šฉ๋ถˆ๊ฐ€) ์„œ๋น„์Šค ์ถ”๊ฐ€ ํ›„ ์ƒˆ๋กœ์šด ํ‚ค ๋ฐœ๊ธ‰๋ฐ›์œผ๋ฉด localhost ์ถ”๊ฐ€ ์‚ฌ์šฉ๊ฐ€๋Šฅ

  • Callback URL

์ „์ฒด์ฃผ์†Œ ๋“ฑ๋ก {EC2ํผ๋ธ”๋ฆญ DNS}:8080/login/oauth2/code/naver

Travis CI ๋ฐฐํฌ ์ž๋™ํ™”

https://travis-ci.org

  1. github๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ํ›„ ์„ค์ •์ฐฝ์—์„œ ์ €์žฅ์†Œ ์ƒํƒœ๋ฐ” ํ™œ์„ฑํ™”
  2. ํ”„๋กœ์ ํŠธ ์„ค์ •
  • build.gradle ๊ณผ ๊ฐ™์€ ์œ„์น˜์— .travis.yml ์ƒ์„ฑ
language: java
jdk:
  - openjdk8

branches:          
  only:
    - master

# Travis CI ์„œ๋ฒ„์˜ Home
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'
script: "./gradlew clean build"

# CI ์‹คํ–‰ ์™„๋ฃŒ์‹œ ๋ฉ”์ผ๋กœ ์•Œ๋žŒ
notifications:
  email:
    recipients:
      - [email protected]
  • branches: ์–ด๋Š ๋ธŒ๋žœ์น˜๊ฐ€ ํ‘ธ์‹œ๋  ๋•Œ ์ˆ˜ํ–‰ํ• ์ง€ ์ง€์ •
  • cache: ๊ฐ™์€ ์˜์กด์„ฑ์€ ๋‹ค์Œ ๋ฐฐํฌ๋•Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค์ •
  • script: ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ๋˜์—ˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด
  • notifications: Travis CI ์‹คํ–‰ ์™„๋ฃŒ ์‹œ ์ž๋™์œผ๋กœ ์•Œ๋žŒ์ด ๊ฐ€๋„๋ก ์„ค์ •

Travis CI ์™€ AWS S3 ์—ฐ๋™ํ•˜๊ธฐ

  • S3 : AWS ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ผ์ข…์˜ ํŒŒ์ผ์„œ๋ฒ„ (์ •์ ํŒŒ์ผ, ๋ฐฐํฌํŒŒ์ผ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ์ œ๊ณต)
  • Travis CI ์—ฐ๋™์‹œ ๊ตฌ์กฐ
  1. Github Repository Push
  2. Travis CI > AWS S3 : jar ์ „๋‹ฌ
  3. Travis CI > AWS CodeDeploy : ๋ฐฐํฌ ์š”์ฒญ
  4. AWS S3 > AWS CodeDeploy : jar ์ „๋‹ฌ
  5. AWS CodeDeploy > AWS EC2 : ๋ฐฐํฌ

AWS Key ๋ฐœ๊ธ‰

  1. AWS Console ์—์„œ IAM ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ด๋™
  2. IAM ํŽ˜์ด์ง€ : ์‚ฌ์šฉ์ž > ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ๋ฒ„ํŠผ
  3. ์—‘์„ธ์Šค ์œ ํ˜• : ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์—‘์„ธ์Šค
  4. ๊ถŒํ•œ(๊ธฐ์กด ์ •์ฑ… ์ง์ ‘ ์—ฐ๊ฒฐ) : AmazonS3FullAccess, AWSCodeDeployFullAccess
  5. ์—‘์„ธ์Šค ํ‚ค ID, ๋น„๋ฐ€ ์—‘์„ธ์Šค ํ‚ค ์ƒ์„ฑ ์™„๋ฃŒ

Travis CI ์— Key ๋“ฑ๋ก

  1. travis-ci.org ์ด๋™
  2. Setting > Environment Variables ๋“ฑ๋ก

AWS_ACCESS_KEY : ์—‘์„ธ์Šค ํ‚ค ID AWS_SECRET_KEY : ๋น„๋ฐ€ ์—‘์„ธ์Šค ํ‚ค

S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ

  1. AWS > S3 ์ด๋™ > ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ
  2. ์˜ต์…˜

ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ์„ ์œ„ํ•œ ๋ฒ„ํ‚ท ์„ค์ • : ๋ชจ๋“  ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ (IAM ์‚ฌ์šฉ์ž๋กœ ๋ฐœ๊ธ‰๋ฐ›์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผ ๊ฐ€๋Šฅ)

.travis.yml ์ถ”๊ฐ€

before_deploy:
  - zip -r griffin-springboot2-webservice *     # CodeDeploy ๋Š” Jar ํŒŒ์ผ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์••์ถ•
  - mkdir -p deploy
  - mv griffin-springboot2-webservice.zip deploy/griffin-springboot2-webservice.zip

deploy:                                   # ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์—ฐ๋™๋  ํ–‰์œ„ ์„ ์–ธ (S3๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ํ˜น์€ CodeDeploy ๋กœ ๋ฐฐํฌ ๋“ฑ)
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY        # Travis repo setting ์— ์„ค์ •๋œ ๊ฐ’
    secret_access_key: $AWS_SECRET_KEY    # Travis repo setting ์— ์„ค์ •๋œ ๊ฐ’
    bucket: griffin-springboot-build      # S3 ๋ฒ„ํ‚ท
    region: ap-northeast-2
    cleanup: true,
    acl: private                          # zip ํŒŒ์ผ ์ ‘๊ทผ์„ private ๋กœ
    local_dir: deploy                     # before_deploy ์—์„œ ์ƒ์„ฑํ•œ ๋””๋ ‰ํ† ๋ฆฌ (ํ•ด๋‹น์œ„์น˜์˜ ํŒŒ์ผ๋“ค๋งŒ S3 ์ „์†ก)
#    wait-until-deployed: true

Travis CI ์™€ AWS S3, CodeDeploy ์—ฐ๋™ํ•˜๊ธฐ

EC2 ๊ฐ€ CodeDeploy ๋ฅผ ์—ฐ๋™ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ IAM ์—ญํ• ์„ ์ƒ์„ฑ
  1. EC2์— IAM ์—ญํ•  ์ถ”๊ฐ€ํ•˜๊ธฐ

์—ญํ• : AWS ์„œ๋น„์Šค์—๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ
(EC2, CodeDeploy, SQS ๋“ฑ)
์‚ฌ์šฉ์ž: AWS ์„œ๋น„์Šค ์™ธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ
(๋กœ์ปฌPC, IDC ์„œ๋ฒ„ ๋“ฑ)

  • AWS ์„œ๋น„์Šค > EC2
  • ์ •์ฑ…: AmazonEC2RoleforAWSCodeDeploy
  1. ์ƒ์„ฑํ•œ ์—ญํ• ์„ EC2 ์„œ๋น„์Šค์— ๋“ฑ๋ก
  • ์ธ์Šคํ„ด์Šค ์šฐํด๋ฆญ > ๋ณด์•ˆ > IAM ์—ญํ•  ์ˆ˜์ •
  1. ์—ญํ•  ์„ ํƒ ์™„๋ฃŒ ํ›„ ํ•ด๋‹น EC2 ์ธ์Šคํ„ด์Šค ์žฌ๋ถ€ํŒ…

  2. CodeDeploy ์—์ด์ „ํŠธ ์„ค์น˜

  • EC2 ์— ์ ‘์†
$ aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
$ wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install

install ํŒŒ์ผ ์‹คํ–‰ ๊ถŒํ•œ ์ถ”๊ฐ€

$ chmod +x ./install

ruby ์„ค์น˜ ํ›„ install ํŒŒ์ผ๋กœ ์„ค์น˜ ์ง„ํ–‰

sudo yum install ruby
sudo ./install auto 

Agent ์ •์ƒ ์‹คํ–‰์—ฌ๋ถ€ ํ™•์ธ

$ sudo service codedeploy-agent status

The AWS CodeDeploy agent is running as PID 3436
  1. CodeDeploy ๋ฅผ ์œ„ํ•œ ์—ญํ•  ์ƒ์„ฑ
  • IAM > ์—ญํ•  ์ƒ์„ฑ > AWS ์„œ๋น„์Šค > CodeDeploy
  1. CodeDeploy ์ƒ์„ฑ

AWS ์˜ ๋ฐฐํฌ ์„œ๋น„์Šค

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ

์ปดํ“จํŒ… ํ”Œ๋žซํผ: EC2/์˜จํ”„๋ ˆ๋ฏธ์Šค

  1. ๋ฐฐํฌ๊ทธ๋ฃน์ƒ์„ฑ

์„œ๋น„์Šค์—ญํ• : CodeDeploy์šฉ IAM ์„ ํƒ
๋ฐฐํฌ์œ ํ˜•: ํ˜„์žฌ์œ„์น˜ (๋ฐฐํฌํ•  ์„œ๋น„์Šค๊ฐ€ 2๋Œ€ ์ด์ƒ์ด๋ผ๋ฉด ๋ธ”๋ฃจ/๊ทธ๋ฆฐ)
ํ™˜๊ฒฝ๊ตฌ์„ฑ: Amazon EC2 ์„œ๋น„์Šค
๋ฐฐํฌ์„ค์ •: CodeDeployDefault.AllAtOnce (ํ•œ๋ฒˆ ๋ฐฐํฌํ•  ๋•Œ ๋ช‡ ๋Œ€์˜ ์„œ๋ฒ„์— ๋ฐฐํฌํ• ์ง€๋ฅผ ๊ฒฐ์ •)
๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ: off

  1. CodeDeploy ์„ค์ •
  • appspec.yml
# AWS CodeDeploy ์„ค์ •
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/step2/zip/
    overwrite: yes
  • .travis.yml
deploy:
  ...
  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY # Travis repo setting ์— ์„ค์ •๋œ ๊ฐ’
    secret_access_key: $AWS_SECRET_KEY    # Travis repo setting ์— ์„ค์ •๋œ ๊ฐ’
    bucket: griffin-springboot-build      # S3 ๋ฒ„ํ‚ท
    key: griffin-springboot2-webservice.zip # ๋นŒ๋“œ ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ์ „๋‹ฌ
    bundle_type: zip  # ์••์ถ• ํ™•์žฅ์ž
    application: griffin-springboot2-webservice # ์›น ์ฝ˜์†”์—์„œ ๋“ฑ๋กํ•œ CodeDeploy ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
    deployment_group: griffin-springboot2-webservice-group  # CodeDeploy ๋ฐฐํฌ ๊ทธ๋ฃน
    region: ap-northeast-2
    wait-until-deployed: true
  1. ์ •์ƒ์ˆ˜ํ–‰ ํ™•์ธ

S3 ๋ฒ„ํ‚ท: zip
CodeDeploy: ๋ฐฐํฌ๋‚ด์—ญ
EC2: /home/ec2-user/app/step2/zip ์œ„์น˜์— ํŒŒ์ผ ํ™•์ธ

heroku ๋กœ ์ด์ „..์˜ˆ์ •.. https://griffin-springboot2-webservice.herokuapp.com

griffin-springboot2-webservice's People

Contributors

griffinna avatar skandla2002 avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Forkers

skandla2002

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.