์ฐธ๊ณ : ์คํ๋ง๋ถํธ์ AWS๋ก ํผ์ ๊ตฌํํ๋ ์น ์๋น์ค (ํ๋ฆฌ๋ / ์ด๋์ฑ ์ง์)
- ์คํ๋ง ๋ถํธ ์์ํ๊ธฐ
- ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑ
- JPA๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ค๋ฃจ๊ธฐ
- Mustache ํ๋ฉด๊ตฌ์ฑ
- ์คํ๋ง ์ํ๋ฆฌํฐ์ OAuth2.0 ๋ก๊ทธ์ธ ๊ธฐ๋ฅ
- AWS ์๋ฒํ๊ฒฝ - AWS EC2
- AWS ๋ฐ์ดํฐ๋ฒ ์ด์คํ๊ฒฝ - AWS RDS
- EC2 ์๋ฒ์ ํ๋ก์ ํธ ๋ฐฐํฌ
- Travis CI ๋ฐฐํฌ ์๋ํ
- ๋ฌด์ค๋จ์๋น์ค
- EC2 : Elastic Compute Cloud (AWS์์ ์ ๊ณตํ๋ ์ฑ๋ฅ, ์ฉ๋ ๋ฑ์ ์ ๋์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์๋ฒ)
- 1๋์ t2.micro๋ง ์ฌ์ฉํ๋ฉด 24์๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ
- ์์ธ ๋ฆฌ์ ์ ํ
- EC2 ์ธ์คํด์ค ์์
- AMI (Amazon Machine Image) ์ ํ > Amazon Linux AMI
EC2 ์ธ์คํด์ค๋ฅผ ์์ํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ด๋ฏธ์ง๋ก ๋ง๋ค์ด ๋ ๊ฒ- ์คํ ๋ฆฌ์ง : 30GB ๊น์ง ํ๋ฆฌํฐ์ด๋ก ๊ฐ๋ฅ
- ํ๊ทธ : ์น ์ฝ์์์ ํ๊ธฐ๋ ํ๊ทธ์ธ Name ํ๊ทธ๋ฅผ ๋ฑ๋ก (๋ณธ์ธ ์๋น์ค์ ์ธ์คํด์ค๋ฅผ ๋ํ๋ผ ์ ์๋ ๊ฐ)
- ๋ฐฉํ๋ฒฝ : SSH (AWS EC2 ์ ํฐ๋ฏธ๋๋ก ์ ์ ) > ๋ณธ์ธ IP์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ์์ ํจ
- EIP (Elasic IP, AWS์ ๊ณ ์ IP) ํ ๋นํ ์ธ์คํด์ค์ ์ฐ๊ฒฐ
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์ ๋ฑ๋กํ ์๋น์ค๋ช
}
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
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date
๊ฐ ์๋ฒ๊ฐ ์ด๋ ์๋น์ค์ธ์ง ํํํ๊ธฐ ์ํด HOSTNAME ์ ๋ณ๊ฒฝ
sudo vim /etc/sysconfig/network
HOSTNAME ์ผ๋ก ๋์ด์๋ ๋ถ๋ถ์ ์ํ๋ ์๋น์ค๋ช ์ผ๋ก ๋ณ๊ฒฝ
HOSTNAME=griffin-springboot2-webservice
/etc/hosts ์ ๋ณ๊ฒฝํ hostname ๋ฑ๋ก
sudo vim /etc/hosts
127.0.0.1 ๋ฑ๋กํHOSTNAME
curl ๋ฑ๋กํ ํธ์คํธ ์ด๋ฆ
- DBMS - MariaDB ์ ํ
- ํ ํ๋ฆฟ - ํ๋ฆฌํฐ์ด
- ๋คํธ์ํฌ - ํผ๋ธ๋ฆญ ์์ธ์ค ๊ธฐ๋ฅ on (์ง์ ๋ IP๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ ์ด)
- ํ์์กด - Asia/Seoul
- 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
- Max Connection (150์ผ๋ก ์ค์ )
ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ ํ, ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ต์ ์์ (DB ํ๋ผ๋ฏธํฐ ๊ทธ๋ฃน) / ์ฌ๋ถํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณด์๊ทธ๋ฃน ์ ํ
- EC2์ ์ฌ์ฉ๋ ๋ณด์๊ทธ๋ฃน์ ๊ทธ๋ฃนID ๋ฅผ RDS ๋ณด์๊ทธ๋ฃน์ ์ธ๋ฐ์ด๋๋ก ์ถ๊ฐ
MYSQL/Aurora | TCP | 3306 | ์ฌ์ฉ์์ง์ | {EC2 ๋ณด์๊ทธ๋ฃนID}
MYSQL/Aurora | TCP | 3306 | ๋ด IP | {๋ด IP}- 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;
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)
# 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
~/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 &
- ํ ์ด๋ธ ์์ฑ
# ์ ํ๋ฆฌ์ผ์ด์
ํ
์ด๋ธ
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;
- ํ๋ก์ ํธ ์ค์
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
- 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 &
- AWS ๋ณด์๊ทธ๋ฃน ๋ณ๊ฒฝ
EC2 ๋ณด์๊ทธ๋ฃน์ 8080 ํฌํธ๊ฐ ์ด๋ ค์๋์ง ํ์ธ
- Google ์ EC2 ์ฃผ์ ๋ฑ๋ก
๊ตฌ๊ธ์น์ฝ์ (https://console.cloud.google.com/home/dashboard)
API ๋ฐ ์๋น์ค > ์ฌ์ฉ์์ธ์ฆ์ ๋ณด
- OAuth ๋์ ํ๋ฉด > ์น์ธ๋ ๋๋ฉ์ธ
http:// ์์ด EC2 ํผ๋ธ๋ฆญ DNS ๋ฑ๋ก
- ์ฌ์ฉ์์ธ์ฆ์ ๋ณด > ์๋น์ค ์ ํ
ํผ๋ธ๋ฆญ DNS ์ฃผ์์ {ํผ๋ธ๋ฆญ}:8080/login/oauth2/code/google ์น์ธ๋ ๋ฆฌ๋๋ ์ URL ๋ฑ๋ก
- Naver ์ EC2 ์ฃผ์ ๋ฑ๋ก
๋ค์ด๋ฒ ๊ฐ๋ฐ์ ์ผํฐ (https://developers.naver.com/apps/#/myapps)
- ์๋น์ค URL
๋ก๊ทธ์ธ์ ์๋ํ๋ ์๋น์ค๊ฐ ๋ค์ด๋ฒ์ ๋ฑ๋ก๋ ์๋น์ค์ธ์ง ํ๋จํ๊ธฐ ์ํ ํญ๋ชฉ 8080 ํฌํธ๋ ์ ์ธํ๊ณ ์ค์ ๋๋ฉ์ธ ์ฃผ์๋ง ์ ๋ ฅ 1๊ฐ์ ์ฃผ์๋ง ํ์ฉ (์์ ํ localhost ์ฌ์ฉ๋ถ๊ฐ) ์๋น์ค ์ถ๊ฐ ํ ์๋ก์ด ํค ๋ฐ๊ธ๋ฐ์ผ๋ฉด localhost ์ถ๊ฐ ์ฌ์ฉ๊ฐ๋ฅ
- Callback URL
์ ์ฒด์ฃผ์ ๋ฑ๋ก {EC2ํผ๋ธ๋ฆญ DNS}:8080/login/oauth2/code/naver
- github๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ํ ์ค์ ์ฐฝ์์ ์ ์ฅ์ ์ํ๋ฐ ํ์ฑํ
- ํ๋ก์ ํธ ์ค์
- 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 ์คํ ์๋ฃ ์ ์๋์ผ๋ก ์๋์ด ๊ฐ๋๋ก ์ค์
- S3 : AWS ์์ ์ ๊ณตํ๋ ์ผ์ข ์ ํ์ผ์๋ฒ (์ ์ ํ์ผ, ๋ฐฐํฌํ์ผ ๊ด๋ฆฌ ๊ธฐ๋ฅ ์ ๊ณต)
- Travis CI ์ฐ๋์ ๊ตฌ์กฐ
- Github Repository Push
- Travis CI > AWS S3 : jar ์ ๋ฌ
- Travis CI > AWS CodeDeploy : ๋ฐฐํฌ ์์ฒญ
- AWS S3 > AWS CodeDeploy : jar ์ ๋ฌ
- AWS CodeDeploy > AWS EC2 : ๋ฐฐํฌ
- AWS Console ์์ IAM ๊ฒ์ํ์ฌ ์ด๋
- IAM ํ์ด์ง : ์ฌ์ฉ์ > ์ฌ์ฉ์ ์ถ๊ฐ ๋ฒํผ
- ์์ธ์ค ์ ํ : ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์์ธ์ค
- ๊ถํ(๊ธฐ์กด ์ ์ฑ ์ง์ ์ฐ๊ฒฐ) : AmazonS3FullAccess, AWSCodeDeployFullAccess
- ์์ธ์ค ํค ID, ๋น๋ฐ ์์ธ์ค ํค ์์ฑ ์๋ฃ
- travis-ci.org ์ด๋
- Setting > Environment Variables ๋ฑ๋ก
AWS_ACCESS_KEY : ์์ธ์ค ํค ID AWS_SECRET_KEY : ๋น๋ฐ ์์ธ์ค ํค
- AWS > S3 ์ด๋ > ๋ฒํท ๋ง๋ค๊ธฐ
- ์ต์
ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ์ ์ํ ๋ฒํท ์ค์ : ๋ชจ๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ (IAM ์ฌ์ฉ์๋ก ๋ฐ๊ธ๋ฐ์ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผ ๊ฐ๋ฅ)
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
- EC2์ IAM ์ญํ ์ถ๊ฐํ๊ธฐ
์ญํ : AWS ์๋น์ค์๋ง ํ ๋นํ ์ ์๋ ๊ถํ
(EC2, CodeDeploy, SQS ๋ฑ)
์ฌ์ฉ์: AWS ์๋น์ค ์ธ์ ์ฌ์ฉํ ์ ์๋ ๊ถํ
(๋ก์ปฌPC, IDC ์๋ฒ ๋ฑ)
- AWS ์๋น์ค > EC2
- ์ ์ฑ : AmazonEC2RoleforAWSCodeDeploy
- ์์ฑํ ์ญํ ์ EC2 ์๋น์ค์ ๋ฑ๋ก
- ์ธ์คํด์ค ์ฐํด๋ฆญ > ๋ณด์ > IAM ์ญํ ์์
-
์ญํ ์ ํ ์๋ฃ ํ ํด๋น EC2 ์ธ์คํด์ค ์ฌ๋ถํ
-
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
- CodeDeploy ๋ฅผ ์ํ ์ญํ ์์ฑ
- IAM > ์ญํ ์์ฑ > AWS ์๋น์ค > CodeDeploy
- CodeDeploy ์์ฑ
AWS ์ ๋ฐฐํฌ ์๋น์ค
- ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
์ปดํจํ ํ๋ซํผ: EC2/์จํ๋ ๋ฏธ์ค
- ๋ฐฐํฌ๊ทธ๋ฃน์์ฑ
์๋น์ค์ญํ : CodeDeploy์ฉ IAM ์ ํ
๋ฐฐํฌ์ ํ: ํ์ฌ์์น (๋ฐฐํฌํ ์๋น์ค๊ฐ 2๋ ์ด์์ด๋ผ๋ฉด ๋ธ๋ฃจ/๊ทธ๋ฆฐ)
ํ๊ฒฝ๊ตฌ์ฑ: Amazon EC2 ์๋น์ค
๋ฐฐํฌ์ค์ : CodeDeployDefault.AllAtOnce (ํ๋ฒ ๋ฐฐํฌํ ๋ ๋ช ๋์ ์๋ฒ์ ๋ฐฐํฌํ ์ง๋ฅผ ๊ฒฐ์ )
๋ก๋๋ฐธ๋ฐ์: off
- 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
- ์ ์์ํ ํ์ธ
S3 ๋ฒํท: zip
CodeDeploy: ๋ฐฐํฌ๋ด์ญ
EC2: /home/ec2-user/app/step2/zip ์์น์ ํ์ผ ํ์ธ