묻고 답해요
152만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
해결됨비전공자도 이해할 수 있는 AWS 입문/실전
[실습] 1.S3 버킷 생성하기 영상 짤림(?)
안녕하세요. 강의 잘 듣고있습니다.강의 내용에 관한 질문은 아니구요. 커리큘럼 중, '섹션5. 파일 및 이미지 업로드 (S3)'의 '[실습] 1.S3 버킷 생성하기' 강의가 있는데, 영상이 3초로 이상 편집된 것 같습니다. 저만 그렇게 보이는 것인지 모르겠지만 확인 부탁드립니다.
-
미해결실리콘밸리 엔지니어와 함께하는 아마존 웹서비스(Core)편
강의내용 중복
11:46 구간에서 강의가 끝났는데요 다시 중간으로 돌아가서 강의가 반복 재생됩니다. 확인바랍니다~
-
해결됨비전공자도 이해할 수 있는 AWS 입문/실전
ELB로 부하분산되고 있는 EC2의 서비스를 블루그린 배포하는 강의를 추가해주시면 감사하겠습니다.
안녕하세요, 강사님좋은 강의 만들어 주셔서 감사합니다.다름이 아니오라 ELB로 부하분산되고 있는 EC2의 서비스를 블루그린 배포하는 강의를 추가해주시면 감사하겠습니다.강사님, 오늘도 기분 좋은 하루 되세요~
-
미해결
EC2 배포후 구글 로그인 안됨
스프링부트 REST + OAuth2 + JWT를 사용하고 있는 상황인데로컬에서는 잘 돌아갑니다.로컬에서 소셜로그인이 성공하면 OAuth2SuccessHandler에서 바로 JSON으로 반환해주는 형태입니다. 즉, 컨트롤러가 딱히 무슨 역할을 하지 않아도 바로 반환을 해줍니다.하지만 EC2에 배포하고 구글 개발자 센터, yml에 EC2 퍼블릭을 제대로 입력해주고 제대로 일치하는 것을 확인했고버튼을 클릭하면 아이디들이 제대로 뜹니다. 하지만 로그인한 결과 로그인할 아이디를 클릭을 하면Whitelabel Error Page 404페이지가 뜹니다. 그래서 실패했을 때 JSON으로 반환시켜주는 로직을 추가해서 확인한 결과"error 발생 : ": "[authorization_request_not_found] "이러한 오류가 발생했습니다. 항상 체크해야하는요소yml 체크함구글 개발자 센터 확인함→ 1, 2번은 일치함EC2 인스턴스의 보안 그룹이 OAuth2 콜백 URL로 요청을 수신할 수 있도록 올바르게 설정되었는지 확인 → 이거는 어떻게 다른 설정법이 있을까요?application.yml 또는 application.properties에 설정된 값들이 프로덕션 환경에 맞게 정확히 설정이렇게 환경변수를 받아서 ec2 배포시 사용할 수 있도록 설정했는데 추가적으로 또 뭔가를 해줘야 하나요? 혹시 OAuth2 google을 테스터로 해놓고 http로 해놓으면 ec2 배포시에는 사용하지 못하나요?
-
미해결
배포후 소셜로그인 에러
스프링부트 REST + OAuth2 + JWT를 사용하고 있는 상황인데로컬에서는 잘 돌아갑니다.로컬:<a id="google-login" href="/oauth2/authorization/google">구글 로그인</a> <a id="naver-login" href="/oauth2/authorization/naver">네이버 로그인</a> @Service @Log4j2 @RequiredArgsConstructor public class PrincipalOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> { private final MemberRepository memberRepository; private final JwtProvider jwtProvider; private final TokenRepository tokenRepository; @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { // userRequest.getClientRegistration()은 인증 및 인가된 사용자 정보를 가져오는 // Spring Security에서 제공하는 메서드입니다. ClientRegistration clientRegistration = userRequest.getClientRegistration(); log.info("clientRegistration : " + clientRegistration); // 소셜 로그인 accessToken String socialAccessToken = userRequest.getAccessToken().getTokenValue(); log.info("소셜 로그인 accessToken : " + socialAccessToken); OAuth2UserService<OAuth2UserRequest, OAuth2User> oAuth2UserService = new DefaultOAuth2UserService(); log.info("oAuth2UserService : " + oAuth2UserService); // 소셜 로그인한 유저정보를 가져온다. OAuth2User oAuth2User = oAuth2UserService.loadUser(userRequest); log.info("oAuth2User : " + oAuth2User); log.info("getAttribute : " + oAuth2User.getAttributes()); // 회원가입 강제 진행 OAuth2UserInfo oAuth2UserInfo = null; String registrationId = clientRegistration.getRegistrationId(); log.info("registrationId : " + registrationId); if(registrationId.equals("google")) { log.info("구글 로그인"); oAuth2UserInfo = new GoogleUser(oAuth2User, clientRegistration); } else if(registrationId.equals("naver")) { log.info("네이버 로그인"); oAuth2UserInfo = new NaverUser(oAuth2User, clientRegistration); } else { log.error("지원하지 않는 소셜 로그인입니다."); } // 사용자가 로그인한 소셜 서비스를 가지고 옵니다. // 예시) google or naver 같은 값을 가질 수 있다. String provider = oAuth2UserInfo.getProvider(); // 사용자의 소셜 서비스(provider)에서 발급된 고유한 식별자를 가져옵니다. // 이 값은 해당 소셜 서비스에서 유니크한 사용자를 식별하는 용도로 사용됩니다. String providerId = oAuth2UserInfo.getProviderId(); String name = oAuth2UserInfo.getName(); // 사용자의 이메일 주소를 가지고 옵니다. // 소셜 서비스에서 제공하는 이메일 정보를 사용합니다. String email = oAuth2UserInfo.getEmail(); // 소셜 로그인의 경우 무조건 USER 등급으로 고정이다. Role role = Role.USER; MemberEntity findUser = memberRepository.findByEmail(email); if(findUser == null) { log.info("소셜 로그인이 최초입니다."); log.info("소셜 로그인 자동 회원가입을 진행합니다."); findUser = MemberEntity.builder() .email(email) .memberName(name) .provider(provider) .providerId(providerId) .memberRole(role) .nickName(name) .build(); log.info("member : " + findUser); findUser = memberRepository.save(findUser); } else { log.info("로그인을 이미 한적이 있습니다."); } // 권한 가져오기 List<GrantedAuthority> authorities = getAuthoritiesForUser(findUser); // 토큰 생성 TokenDTO tokenForOAuth2 = jwtProvider.createTokenForOAuth2(email, authorities, findUser.getMemberId()); // 기존에 이 토큰이 있는지 확인 TokenEntity findToken = tokenRepository.findByMemberEmail(tokenForOAuth2.getMemberEmail()); TokenEntity saveToken; // 기존의 토큰이 없다면 새로 만들어준다. if(findToken == null) { TokenEntity tokenEntity = TokenEntity.tokenEntity(tokenForOAuth2); saveToken = tokenRepository.save(tokenEntity); log.info("token : " + saveToken); } else { // 기존의 토큰이 있다면 업데이트 해준다. tokenForOAuth2 = TokenDTO.builder() .grantType(tokenForOAuth2.getGrantType()) .accessToken(tokenForOAuth2.getAccessToken()) .accessTokenTime(tokenForOAuth2.getAccessTokenTime()) .refreshToken(tokenForOAuth2.getRefreshToken()) .refreshTokenTime(tokenForOAuth2.getRefreshTokenTime()) .memberEmail(tokenForOAuth2.getMemberEmail()) .memberId(tokenForOAuth2.getMemberId()) .build(); TokenEntity tokenEntity = TokenEntity.updateToken(findToken.getId(), tokenForOAuth2); saveToken = tokenRepository.save(tokenEntity); log.info("token : " + saveToken); } // 토큰이 제대로 되어 있나 검증 if(StringUtils.hasText(saveToken.getAccessToken()) && jwtProvider.validateToken(saveToken.getAccessToken())) { Authentication authenticationToken = jwtProvider.getAuthentication(saveToken.getAccessToken()); log.info("authentication : " + authenticationToken); SecurityContextHolder.getContext().setAuthentication(authenticationToken); UserDetails userDetails = new User(email, "", authorities); log.info("userDetails : " + userDetails); Authentication authenticationUser = new UsernamePasswordAuthenticationToken(userDetails, authorities); log.info("authentication1 : " + authenticationUser); SecurityContextHolder.getContext().setAuthentication(authenticationUser); } else { log.info("검증 실패"); } // attributes가 있는 생성자를 사용하여 PrincipalDetails 객체 생성 // 소셜 로그인인 경우에는 attributes도 함께 가지고 있는 PrincipalDetails 객체를 생성하게 됩니다. PrincipalDetails principalDetails = new PrincipalDetails(findUser, oAuth2User.getAttributes()); log.info("principalDetails : " + principalDetails); return principalDetails; } // 권한 가져오기 로직 private List<GrantedAuthority> getAuthoritiesForUser(MemberEntity findUser) { Role role = findUser.getMemberRole(); List<GrantedAuthority> authorities = new ArrayList<>(); authorities.add(new SimpleGrantedAuthority("ROLE_" + role.name())); log.info("권한 : " + role.name()); return authorities; } } @Log4j2 @RequiredArgsConstructor @Component public class OAuth2SuccessHandler implements AuthenticationSuccessHandler { private final MemberRepository memberRepository; private final TokenRepository tokenRepository; // Jackson ObjectMapper를 주입합니다. private final ObjectMapper objectMapper; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { try { log.info("OAuth2 Login 성공!"); // 소셜 로그인 이메일 가져오기 String email = authentication.getName(); log.info("email : " + email); // 토큰 조회 TokenEntity findToken = tokenRepository.findByMemberEmail(email); log.info("token : " + findToken); // 토큰 DTO 반환 TokenDTO tokenDTO = TokenDTO.toTokenDTO(findToken); // 회원 조회 MemberEntity findUser = memberRepository.findByEmail(email); // 회원 DTO 반환 ResponseMemberDTO memberDTO = ResponseMemberDTO.socialMember(findUser); // 헤더에 담아준다. response.addHeader("email", memberDTO.getEmail()); // 바디에 담아준다. Map<String, Object> responseBody = new HashMap<>(); responseBody.put("providerId", memberDTO.getProviderId()); responseBody.put("provider", memberDTO.getProvider()); responseBody.put("accessToken", tokenDTO.getAccessToken()); responseBody.put("refreshToken", tokenDTO.getRefreshToken()); responseBody.put("email", tokenDTO.getMemberEmail()); responseBody.put("memberId", tokenDTO.getMemberId()); responseBody.put("grantType", tokenDTO.getGrantType()); // JSON 응답 전송 response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(objectMapper.writeValueAsString(responseBody)); } catch (Exception e) { // 예외가 발생하면 클라이언트에게 오류 응답을 반환 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().write("OAuth 2.0 로그인 성공 후 오류 발생: " + e.getMessage()); response.getWriter().flush(); } } }로컬에서 소셜로그인이 성공하면 OAuth2SuccessHandler에서 바로 JSON으로 반환해주는 형태입니다. 즉, 컨트롤러가 딱히 무슨 역할을 하지 않아도 바로 반환을 해줍니다. 하지만 EC2에 배포하고 구글 개발자 센터, yml에 EC2 퍼블릭을 제대로 입력해주고로그인한 결과 아이디들 제대로 뜨는데 로그인할 아이디를 클릭을 하면Whitelabel Error Page 404페이지가 뜹니다. 로컬 코드를 그대로 배포한건데 왜 안될까요?
-
미해결
배포 후 소셜 로그인
로컬에서는 구글 소셜로그인이 제대로 돌아가고 로그인시 가입, JWT 발급까지 제대로 돌아가는데 프로젝트를 EC2에 배포하고 개발자센터에 승인된 URI에 등록하고 yml에 redirect-uri 똑같이 등록을 했는데 배포시에는 에러가 발생합니다.발생한 에러:구글 아이디들이 나오기는 하는데 클릭을 하면이 에러가 발생합니다. 이게 로컬에서도 안되면 이해가 가는데 로컬에서는 에러없이 잘돌아갑니다. 대체 무슨 문제일까요... ㅠㅠ 급합니다.
-
미해결처음 만난 AWS
클라우드 스토리지 서비스
네이버 마이박스나 구글 드라이브처럼 사진을 저장해놓는 클라우드 스토리지 서비스를 만들고 싶습니다이런 서비스들은 클라우드 컴퓨팅을 운영하는 회사들 특히 대기업들이 많이 하고 있는데요개발이나 운영에 다른 서비스들보다 힘든가요? 왜 스타트업들은 많이 없는지 궁금합니다또 이런 스토리지 서비스를 aws를 통해 제공하면 비용문제가 심각한가요? 일단 서비스 개발과 업그레이드를 하면서 고객을 확보하고 나중에 좀 커졌을때 따로 데이터센터를 만든다고 하면 어떨까요??
-
미해결
스프링부트 EC2 배포 시 소셜로그인, JWT, S3 처리
스프링부트를 EC2에 배포할 때 OAuth2, JWT나 S3를 이미지 넣는 설정 파일(yml)을 보안상 git에 안올라가게 막아주는데 그러면 배포할 때는 어떻게 처리를 해줘야 배포상태에서 OAuth2, JWT나 S3를 이미지 넣는 기능을 사용할 수 있나요??
-
미해결
ec2재부팅 후 ec2 주소 접근 불가능 !!!!! (스프링 배포)
https://velog.io/@dasd412/ec2-%EC%9E%AC%EB%B6%80%ED%8C%85-%ED%9B%84-%EC%97%B0%EA%B2%B0-%EB%B6%88%EA%B0%80-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0이걸 참고해도 보안 다시 해도 전 여전히 안되더라구요.. 결론적으로 배포를 성공했고 배포한 주소가 회원가입에 접근을 못해서 시큐리티 설정 때문에 그런줄 알았는데 여기서 멈췄어야 했나봅니다..로컬에서는 되고 ec2주소로는 접속이 안되어서 찾아보던 중 ec2를 재부팅 하면 해결된다고 해서 따라 했더니https://github.com/jojoldu/freelec-springboot2-webservice/issues/485 이제는 아예 ec2주소에 접근이 불가능합니다 ㅠㅠㅠㅠㅠ 이걸 해결해야 하는데 어떡하나요..
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
ec2 도커 빌드중 빌드 멈춤
안녕하세요 멘토님! 강의 잘 듣고 열심히 정리중 입니다.ㅎㅎ프로젝트를 도커로 배포하는 중에 문제가 발생했습니다.위와같이 도커로 배포중 yarn build를 실행할 때 빌드 시간이 멈추고 진행되지 않습니다.새로고침하고 다시 인스턴스 터미널에 들어가면 연결이 지연되어 연결실패가 뜹니다.(해당 에러는 인스턴스 상태에서 재부팅을 통해 해결했습니다.)해당 문제를 해결하기 위해 아래와 같이 시도했습니다.1. 도커 푸룬으로 이미지, 캐시등 삭제 - docker system prune -a 2. ec2 볼륨을 16기가로 올렸습니다. - 파티션화도 완료시켰습니다. - df -h로 xada1의 용량이 46%에서 23%로 줄어든 것을 확인했습니다. 더이상의 방법이 구글링과 제 머리로는 해결되지 않아 질문 올립니다.감사합니다!
-
미해결
배포에 대한 질문이 있습니다. 급합니다 ㅠㅠ
현재 프론트하고 백엔드하고 배포를 따로 하려고 하는데이 배포를 언제까지 유지해야 하는지가 궁금합니다.포폴에 배포 링크를 담아주고 취업할 때 까지 유지해야 하는지 아니면 배포하고 시연 이미지 첨부한 설명을 포폴에 담고 배포를 종료해도 되는지 어떻게 해야하는지 궁금합니다. 알려주시면 감사하겠습니다 ㅠㅠ (__) 꾸벅
-
미해결
EC2 리눅스에서 리액트 빌드 오류
안녕하세요 제가 AWS EC2 리눅스에서 리액트 프로젝트를 빌드하려는데 오류가 납니다.npm start 까진 잘 되는데 npm run build 명령어를 실행하면 위와 같은 오류가 뜨는데 해결방법이 있을까요...
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
sh: 1: env-cmd: not found
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. aws ec2 배포 과정에서 문제가 있습니다. npm run build:prod 에서 문제로 .package.json에도 env-cmd 가 제대로 설치가 되어있고,script 문에도 정상적으로 적어져 있으나, sh: 1: env-cmd: not found 와 같은문제가 뜨네요 .
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
제로초님 너무 답답하여 질문드려요ㅠ
제로초님 안녕하세요 고민을 몇시간쨰 해보고 있는데 해결을 못하겠어서 처음으로 글을 올려봐요ㅠㅠㅜ 노드버드 하기전에 배포프로세스를 익히고자 CNA로 테스트 레포를 만들고 따라하고 있었는데요 그냥 sudo yarn start로 했을 때는 잘되서 ip 주소로도 접속이 가능한데 이런 에러가 나는데 왜이러는걸까요??ㅠ
-
해결됨React + API Server 프로젝트 개발과 배포 (CI/CD)
EC2 인스턴스 재시작과 (중지/시작) 도메인 레코드 등록/삭제 관련
개설한 EC2 인스턴스를 상시 실행이 아닌, 중지/재시작으로 관리하며 학습하고 있는 중입니다. (비용 때문에) 아마도 Elastic IP 서비스를 이용하지 않으면, 인스턴스 재구동시 IP 정보가 변경될텐데요, 앞서 Route 53 서비스를 통하여 도메인 레코드를 등록한 정보에 새로 구동된 인스턴스 서버의 IP 를 도메인 레코드로 재등록 (삭제/등록) 해줘야만 다시 정상 등록이 될 것으로 이해하고 있습니다. 궁금한 점은, 혹시 인스턴스만 중지시키고, 별도로 도메인 레코드 등록정보를 삭제하지 않았을 경우에 대한 문제점이나 비용 차징에 관한 정보를 자세히 알 수 있을까요?
-
미해결
gradle build 중 complieJava 멈춤현상
안녕하세요. ec2 로 인스턴스를 생성 후 git 에 있는 springboot 기반의 프로젝트를 clone 후 .jar 로 배포를 시키려던 참이였습니다. ec2에는 openjdk11, mysql-server, git 설치 후 clone을 진행하고, 프로젝트 내부에 gradlew 파일에 chmod로 777 권한을 주고 build 를 진행시켰습니다. 보통 전에 하던 프로젝트는 빌드시간이 1분채 걸리지 않았는데, build 중에 complieJava 에서 지금 45분째 넘어가지 않고, 서버가 멈춘듯 합니다. 어떤 문제를 살펴봐야 할까요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요 선생님!! 장고 엑셀다운로드 로딩에 대하여 질문드립니다
안녕하세요!! 선생님!!! ㅎㅎㅎ 장고 다운로드 로딩에 대하여 질문드리려 합니다!! (웹은 장고로만 개발하였습니다!!) 제가 구현한 내용은 단순히 모델을 불러와서 가공후 csv 파일로 response하는 view를 만들었습니다! 그래서 다운로드 버튼을 클릭하면 모델에 있는 데이터가 다운이 되는 그러한 로직입니다! 위와 같이 그냥 요청이 오면 모델을 불러와서 응답해주는?? 단순한 view입니다!ㅎ 다만 join이 많이 걸려있고 데이터가 좀 많다보니 시간이 상당히 많이 소요가 되는데요.. 문제가 다운로드버튼(위에 설명한 view와 연결한버튼)을 클릭 한 후 서버가 이를 처리를 하는데 서버자체가 이 작업을 끝날때 까지 먹통이되는? (제 3자가 웹에 접속했을때도 이 처리 때문에 위 처리가 끝날때 까지 아무런 요청을 할 수 없습니다) 문제가 발생합니다.. 제가 사용한 서버는 AWS EC2를 활용해 도커 compose파일로 nginx, gunicorn, mariadb를 연결해서 하나의 서비스로 만들어 배포하였습니다. 또한 로드밸런서 세팅도 되있습니다. 로컬에서 개발서버로 테스트 할때는 그냥 다운로드 버튼을 클릭을 해도 바로 종료가 가능하고 다른 브라우저로 접근해도 독립적으로 작동했는데 배포를 하니깐 위와 같은 현상이 발생하네요! 서버 성능의 문제인가 해서 인스턴스 유형도 좀더 올려보고 했지만 역시 위문제는 해결되지 않았습니다..ㅠ 그래서 뭔가 비동기적으로 처리하기위해서 celery를 이용해 볼까 했는데 잘못된 접근인건지 잘모르겠지만 피라미터를 어떻게 설정해야할지 몰라서 구현에 실패를 했습니다 ㅠ 서버의 문제라면 어떻게 접근을 해야하는지,,,,, 아니면 장고로 위와 같은 문제가 해결이 가능하다면 어떻게 코드를 작성하면 좋을지 부족한게 많다보니 며칠째 해결이 안되네요 ㅠㅠ 부족한 설명이지만 잘 부탁드리겠습니다!! 너무 감사합니다 선생님!!
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
도커 사용시 pm2사용
안녕하세요! 현재 docker를 사용해서 nest 앱을 ec2에 배포하고 있습니다. docker사용시에는 pm2 사용할 필요가 없나요?? ec2터미널 껐을때 서버가 죽는 것같아서 질문드립니다 ㅠ
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
ssh 명령어 port 22: Connection timed out
안녕하세요. 제로초님! 좋은 강의 잘 수강하고 있습니다. ec2 생성하기 영상에서 배포에 필요한 첫 단계로 aws 인스턴스를 만들어 ssh 연결을 하는 과정에서 어려움이 발생했습니다. 스스로 최대한 해결하려고 시도해봤지만, 안타깝게도 그러지 못 하고 며칠간 삽질만 했습니다. 삽질한 내용을 이 곳에 담기 어려워보여개인 기술 블로그에 작성하였으니 해당 내용을 보시고 조언을 해주시면 감사하겠습니다. https://juicyjerry.tistory.com/283 좋은 강의를 만들어 주셔서 감사드리고 오늘도 좋은 하루 보내세요
-
미해결풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, 배포까지) [풀스택 Part3]
ec2 접속 시도시 타임아웃 에러가 발생합니다.
안녕하세요. ec2 접속 부분에서 자꾸만 타임아웃 에러가 나서 접속이 불가능한 상황인데, 해결할 방법을 찾지 못해서 질문 드립니다. 관련 강의 부분은 클라우드 서비스(AWS 서비스 구축) 챕터의 EC2 접속 강의 3분 10초 쯤에 있습니다. 에러 메시지는 다음과 같습니다. ssh: connect to host 3.36.244.35 port 22: Operation timed out 우선 회사 vpn 때문인가 하여 vpn을 끄고 시도해도 계속 같은 에러가 나구요, Security Group의 Inbound Rule을 체크하라고 해서 해보았는데 22 port의 ssh type으로 0.0.0.0/0 설정이 이미 되어 있습니다. 어떤 점을 더 체크해보면 좋을지 질문 드립니다..!
주간 인기글
순위 정보를
불러오고 있어요