2018년 6월 25일 월요일

API Gateway Private 호출

API Gateway에서 VPCLink로 NLB를이용하여 VPC 안에있는 서버와 연결서비스를 한지 얼마안되어
6월에 드디어 VPC에 API Gateway호출을 위한 endpoint가 생겼다.

기존에는 S3, DynaoDB, EC2만 있었지만 Codebuild, EC2 Message, LoadBalancer, Api Gateway, KMS, Service Catalog, SNS, SSM이 생겼다.

간단하게 설정하는 방법은 아래와 같다.(API Gateway, VPC와 IAM에 대한 이해도가 있는사람 기준)

1. VPC에 Endpoint메뉴를 선택하여 Endpoint 생성버튼을 클릭.
2. AWS Service에 com.amazonaws.{region}.excute-api를 선택, 아래 VPC및 서브넷은 호출할 서버가 있는 서브넷으로 지정.
3. 보안그룹은 VPC IP range의 HTTPS inbound허용으로 새로 생성.
4. Endpoint가 생성완료되면 API의 Endpoint Type을 Private으로 변경.(Custom domain이 생성되어있으면 변경이 안됨. Custom domain제거후 변경)
5. 호출할 API Gateway를 선택하여 왼쪽메뉴의 Resource Policy를 선택하여 Policy를 생성.
(3가지 버튼으로 제공되며 Source VPC Whitelist를 선택하여 policy생성, Policy안 Condition에 {vpce}라고 되어있는부분에 생성한 Endpoint id로 대체하여야 함)
6. 저장하고 API를 Deploy진행
7. 경리된 server에서 API를 호출 테스트

참고 사이트는 아래와 같다.
https://aws.amazon.com/ko/blogs/compute/introducing-amazon-api-gateway-private-endpoints/

2018-9-12 추가 사항
1. PC Peering 으로 연결되었을때 VPC Endpoint를 이용하여 Private API를 호출하려면?
=> C5, i3.metal, R5, R5D, M5 및 Z1D 인스턴스 유형에만 호출된다.
https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/vpce-interface.html#vpce-interface-limitations

2. 혹시 DNS를 AWS에서 제공하는게 아닌 다른곳으로 설정되어있다면 API Gateway VPC endpoint에서 제공된 도메인으로 호출이 안된다. 이럴땐..
=> api 호출시 header 에 Host를 키로 하여 private api의 stg domain을 값으로 설정하여 호출해야 한다.(DX를 이용하는 경우에도 동일하게 해야함.)
https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-private-apis.html

2018년 6월 3일 일요일

AWS에서 Tomcat DynamoDB로 Session 동기화 하기


aws 에서 네트웍이 멀티 케스팅을 지원하지 않는다 하여 일반적인 톰켓에서 지원 하는 session clustering을 할수 없다고 한다. 그래서 redis나 memcache, dynamodb로 session clustring하는걸 지원한다고 한다.

redis,memcach, dynamodb중 dynamodb session clustering설정을 알아보고자 한다.


여기서는 톰캣 설치 및 다운로드는 제외한다.

clustering을 하려면 aws sdk 및 dynamodb session library를 다운받아 프로젝트나 tomcat lib파일에 위치 해야 한다.

아래는 다운로드 주소:
awssdk : https://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip
aws-dynamodb-session-tomcat : https://github.com/amazon-archives/aws-dynamodb-session-tomcat/releases/download/v2.0.4/aws-dynamodb-session-tomcat-2.0.4.jar(2018월1일기준)

완료 하였으면 tomcat에 conf에 있는 context.xml파일에 아래와 같이 추가 한다.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
             awsAccessKey="myAccessKey"
             awsSecretKey="mySecretKey"
             createIfNotExist="true" />
</Context>

위에  myAccessKey와 mySecretKey는 부여받은 키를 등록한다.

이러면 끝

앗 그런데 세션 정보를 보고 싶다. dynamodb 테이블을 보고 싶은데. 없다 어디에 있을까???
regionid를 설정하지 않아 기본적으로 us-east-1(Virginia)region DynamoDB에 가면 Tomcat_SessionState라는 테이블이 존재 한다.

어 그럼 내가 사용하는 region에 넣으려면 어떻게 해야 하나?
아래와 같이 regionid를 넣어주면 된다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
             regionId="ap-northeast-2"
             endpoint="dynamodb.ap-northeast-2.amazonaws.com"
             createIfNotExist="true" />
</Context>

여기서 주의할점은 regionId와 endpoint를 꼭 같이 넣어줘야 한다.
하나만 있을경우에는 Session 동기화가 안된다.


앗 그런데 2번째에 accesskey와 securitykey넣는게 없다.
이럴때에는 EC2에 IAM role이 부여되었을경우 정상동작하며, role을 부여하지 않았을경우에는 accesskey와 securitykey를 넣어주자.


==2018-09-07 추가==
그런데도 세션동기화가 안되고 톰캣 로그에 session id를 못찾는다는 에러가 나온다면 dynamoDB에 쓰고 읽는 시간이 느려서 그렇다. ㅡ_ㅡ;;

DynamoDB session동기화는 autoscale 용으로 사용하기 보다는 LB의 Sticky를 이용하여 서버가 한쪽에 장애가 날때 세션이 끈기지 않도록 하는 기능으로 사용하는걸 추천한다.







AWS Redis와 Tomcat Session Clustering

근 두달만에 글을 쓰는것 같다 블로그에 글을 올리는게 쉽지 않다는 생각을 해본다. 오늘은 Redis를 이용하여 Tomcat Session Clustering하는 방법을 알아보고자한다. 앞에서 작성했던 AWS DynamoDB를 이용하여 Sessi...