통합검색
로그인
회원가입
Open menu
로그인
회원가입
통합검색
Synology
7
AWS
5
Linux
30
PHP
9
Python
3
Javascript
24
HTML / CSS
12
ETC
4
떡볶이집앞 사진관
Synology
7
AWS
5
Linux
30
PHP
9
Python
3
Javascript
24
HTML / CSS
12
ETC
4
떡볶이집앞 사진관
AWS
route53 상태검사(health check)로 내 서버 접속상태 수시로 체크하기
모든 리전(국가)에서의 내 서버의 접속 상태를 수시로 자동 체크해주는 route53 '상태검사(health check)' 기능을 소개한다. 지정해 놓은 외부 접속 주소를 route53이 수시로 체크 해주고, 접속 불능 상태가 되었다면 이메일로 알림 메일을 보내준다. route53 상태 검사 생성 AWS route53 콘솔을 방문한 다음 (https://us-east-1.console.aws.amazon.com/route53/home) 좌측 메뉴에서 [상태 검사]를 클릭한다. 상단 메뉴바에서 [상태 검사 생성]을 클릭한다. 위와 같이 상태 체크 정보를 입력후 [다음]을 클릭하면 즉시 상태 검사를 수행한다. 1) 모니터링 대상 : 외부 목적지의 접속을 시도해야 하기 때문에 '엔드포인트' 선택 2) 엔드포인트 지정 기준 : '도메인 이름'을 선택하여 도메인 주소로 접속 시도 요청. 접속 시도할 정보를 입력해준다. 상태 체크가 시작되면 아래와 같이 현황을 보여준다. 접속 리전 설정 상태 검사할 접속 국가를 설정하려면, 상태 검사 생성 과정에서 [고급 구성]을 클릭하여 리전을 선택해준다. 상태 체크 비용 route53 의 상태체크 기능은 엔드포인트 개수에 따른 비용이 과금된다. https://aws.amazon.com/ko/route53/pricing/#Health_Checks 나는 AWS 외 엔드포인트로 설정 하였기 때문에 월별 0.75USD 비용이 청구된다. 한화로 천원 가량. https로 요청한다면 2,600원 가량. (세상에 공짜는 없다.)
route53 에서 '루트 도메인' 접속시 'www.도메인' 으로 리다이렉트 시키는 방법 (feat. cloudfront + s3 + ACL)
route53 에 자신의 도메인을 등록하여 dns 서비스를 이용하는 경우 dns 국제 규약에 의거 루트 도메인에는 cname을 적용할 수 없는데 루트 도메인에 cname을 등록해야만 하는 상황인 경우 (chanyeongpark.com 과 www.chanyeongpark.com 모두 cname을 적용하고 싶을 때), 대안으로 cloud-front 와 s3를 활용하여 'www.chanyeongpark.com' 으로 포워딩 시킬 수 있는 방법이 있다. 루트도메인에 cname을 적용해야 하는 배경 나는 홈서버를 운영중이다. 가정용 인터넷 회선은 이따금씩 할당 받는 ip가 변경되기 때문에 필연적으로 DDNS 서비스를 사용하여 변경된 ip를 도메인으로 참조해야 한다. (0000.synology.me) 아이피가 변경될 때 마다 도메인이 바라보는 A 레코드 아이피를 바꿔줄 수 없으니 당연히 레코드를 cname 으로 설정하여 0000.synology.me 를 참조하도록 설정하고 있다. 최근 AWS route53 으로 도메인 네임서버를 이관 하였는데, route53은 루트 도메인(chanyeongpark.com)에 cname을 설정할 수 없어 곤란한 상황. AWS 여러 서비스를 살펴보니, 오브젝트스토리지 서비스인 's3'와 CDN 서비스인 'cloudfront' 서비스를 조합하면 루트도메인(chanyeongpark.com) 접속시 'www.chanyeongpark.com'으로 리다이렉트 시켜 대응할 수 있다는 사실을 알았다. 작동되는 시나리오 chanyeongpark.com 접속시 리다이렉트가 작동되는 시나리오는 아래와 같다. [chanyeongpark.com 요청] -> [cloudfront : https 프록싱] -> [s3 : http 연결] -> [www.chanyeongpark.com redirect] 접속자가 도메인 요청시 cloudfront endpoint로 연결되며, cloudfront는 다시 s3의 정적 웹사이트 endpoint로 연결하면, s3가 정적 웹사이트에 설정된 url로 redirect하는 방식이다. s3 버킷 생성 https://s3.console.aws.amazon.com/s3/get-started?region=ap-northeast-2&bucketType=general®ion=ap-northeast-2 AWS s3는 '정적호스팅' 기능을 제공한다. s3 버킷에 업로드된 파일을 웹에서 열 수 있도록 url을 제공하는 기능인데, 이 정적호스팅은 '정적 웹 사이트 호스팅' 과 '객체에 대한 요청 리디렉션' 두가지 속성을 제공한다. 1) 정적 웹 호스팅 : 저킷 접속시 버킷에 업로드된 특정 html 파일이 열리도록 하는 옵션 2) 객체에 대한 요청 리디렉션 : 버킷 접속시 다른 버킷이나 외부 url로 리디렉션 시키는 옵션 s3 버킷 접속시 'www.chanyeongpark.com'으로 접속될 수 있도록 '객체에 대한 요청 리디렉션' 옵션을 활용해 본다. 우선 새로운 s3 버킷을 만든다. 어떠한 이름으로 생성해도 무관하나, 나는 식별을 위해 버킷명을 도메인명으로 설정했다. 생성된 버킷명을 클릭하여 설정 화면으로 이동한 뒤 [속성]을 클릭한다. 스크롤을 조금 내려 '정적 웹 사이트 호스팅' 섹션에서 [편집]을 클릭한다. 아래와 같이 정적 웹 사이트 호스팅을 설정한다. chanyeongpark.com 접속시 https 도메인으로 접속 되어야 하기 때문에 '프로토콜'은 https를 선택한다. cloudfront 연동을 위한 s3 버킷 생성은 모두 끝났다. 여기서 cloudfront 와 연동시 필요한 정보는 endpoint 다. cloudfront 연동에 앞서 https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=ap-northeast-2 route53와 s3 버킷 연동만으로 리다이렉트 가능하다면 얼마나 좋을까. 아쉽게도 s3 정적호스팅 endpoint는 https 엔드포인트 url을 제공하지 않는다. 내가 운영하는 사이트는 https를 기본으로 사용하고 있기 때문에 인증서가 적용된 https 주소가 필요한 상황. 그래서 cloudfront 추가 연동이 필요하다. 그 전에, cloudfront 사용을 위해선 SSL 인증서가 미리 준비되어 있어야 하는데, 다행스럽게도, AWS는 리소스 사용을 위해 필요한 인증서를 무료로 제공해주고 있다. AWS certificate manager(ACM)에서 인증서 발급 https://us-east-1.console.aws.amazon.com/acm/home?region=us-east-1#/certificates/request AWS certificate manager(ACM)에서 인증서를 발급받아 보자. 주의 할 점은 '버지니아 북부(us-east-1)' 에서 발급받은 인증서만 cloudfront 에 적용 가능하니 반드시 리전부터 변경하고 보자. '퍼블릭 인증서 요청'을 선택한 뒤 아래 [다음] 버튼을 클릭한다. 접속할 루트도메인 주소를 입력하고 하단 [요청]을 클릭하여 발급 요청한다. 약 5분정도 기다리니 인증서가 성공적으로 발급 되었다. cloudfront 생성 및 s3 연동 https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=ap-northeast-2#/distributions cloudfront 에서 새로운 '배포'를 생성하여 s3와 연동한다. 화면 상단 [배포 생성]을 클릭하여 cloudfront를 생성한다. 생성화면의 'Choose origin domain'을 클릭하여, 앞서 생성한 s3 엔드포인트를 선택한다. '뷰어 프로토콜 정책' 중 'Redirect HTTP to HTTPS'를 클릭한다. 엔드포인트 접속시 http와 https 둘다 접속을 허용하지만, http 접속 시에는 https 로 강제 리다이렉트 시키기 위함이다. '대체 도메인 이름(cname)'에 루트 도메인(chanyeongpark.com)을 입력하고 앞서 생성한 SSL 인증서를 선택한 다음 [배포 생성]을 클릭하여 s3와의 연동을 완료한다. route53 에서 루트도메인 레코드에 cloudfront 연결 https://us-east-1.console.aws.amazon.com/route53/v2/home?region=ap-northeast-2#Dashboard 드디어 마지막 단계! route53 에서 루트도메인에 방금 만든 cloudfront 배포 엔드포인트를 연동한다. dns 호스팅 영역을 선택한 다음 [레코드 생성]을 선택한다. 위와 같이 [별칭]을 선택하면 추가 선택 항목이 노출 되는데 '트래픽 라우팅 대상' 에서 'CloudFront 배포에 대한 별칭', '배포 선택' 에서 방금 만든 cloudfront 엔드포인트를 선택한 다음 [레코드 생성]을 클릭하여 모든 과정을 마무리 한다. 마지막으로, 브라우저 창에서 루트도메인 접속시 'www.도메인'으로 리다이렉션이 잘 되는지 확인한다.
AWS PHP sdk로 API Gateway 에 api 키 생성, 사용량계획 연결, 키 삭제
API Gateway에 요율 및 제한량을 api 유저별로 개별 설정해 주기 위해 api 키 생성후 사용량 계획 연결이 필요한데, php sdk를 통해 api 키 생성 및 미리 만들어 놓은 사용량계획을 연결해 주는 방법. IAM 에서 access key 와 secret key 생성 아래 링크를 접속하여 IAM 에서 API에 사용할 access key 와 secret key를 미리 생성해둔다. https://console.aws.amazon.com/iam/home?region=ap-northeast-2#/security_credentials 키 생성 및 사용계획 연결 아래와 같이 구현 가능한데, region, 사용량계획id 등을 적절히 수정해준다. use Aws\Credentials\Credentials; use Aws\Signature\SignatureV4; use Aws\ApiGateway\ApiGatewayClient; // signature 생성 $accessKey = 'access key'; $secretKey = 'srcret key'; // AWS 자격 증명 및 API Gateway 클라이언트 설정 $credentials = new Credentials($accessKey, $secretKey); $apiGatewayClient = new ApiGatewayClient([ 'region' => 'ap-northeast-2', 'version' => 'latest', 'credentials' => $credentials, 'signature' => new SignatureV4('apigateway', 'ap-northeast-2') // region 설정 ]); // API 키 생성 $result = $apiGatewayClient->createApiKey([ 'name' => 'userskey123', // 중복되지 않는 고유한 이름으로 수정 'enabled' => true, // 활성화 여부 'description' => 'hello', // 메모 'value' => 'codehere'.rand(), // 코드를 수동 생성하려면 입력. ]); $apiKeyId = $result['id']; // 성공 결과 값에서 생성된 key의 id를 가져옴 // 사용량계획 연결 $result = $apiGatewayClient->createUsagePlanKey([ 'keyId' => $apiKeyId, // 위에서 생성한 키 id 'usagePlanId' => 'plan id hear', // 미리 만들어 놓은 사용량 계획 ID 'keyType' => 'API_KEY' ]); 키 삭제 키 생성시 DB에 별도 저장한 키 id로 삭제를 수행한다. use Aws\Credentials\Credentials; use Aws\Signature\SignatureV4; use Aws\ApiGateway\ApiGatewayClient; // signature 생성 $accessKey = 'access key'; $secretKey = 'srcret key'; // AWS 자격 증명 및 API Gateway 클라이언트 설정 $credentials = new Credentials($accessKey, $secretKey); $apiGatewayClient = new ApiGatewayClient([ 'region' => 'ap-northeast-2', 'version' => 'latest', 'credentials' => $credentials, 'signature' => new SignatureV4('apigateway', 'ap-northeast-2') // region 설정 ]); // 삭제할 API 키의 ID $apiKeyIdToDelete = 'DB에 별도 보관한 키 ID 입력'; // API 키 삭제 $apiGatewayClient->deleteApiKey([ 'apiKey' => $apiKeyIdToDelete, ]);
AWS S3 리소스에 대한 CORS(크로스도메인) 설정 방법
S3에 저장된 이미지 리소스를 외부 사이트 웹페이지 등에서 사용 할 때 웹페이지의 도메인과 S3 endpoint의 도메인이 달라 크로스도메인(CORS) 오류가 발생하여 리소스가 로드되지 않는 경우 S3 콘솔에서 CORS 를 설정하여 특정 도메인의 크로스도메인 접근을 허용할 수 있다. AWS S3 버킷 관리 콘솔 AWS - S3 - 버킷 선택 - 권한 - CORS(Cross-origin 리소스 공유) 로 이동하여 [편집] 버튼을 클릭하여 관리 팝업을 연 다음 아래와 같 이 입력한다. CORS 설정 (JSON) AWS S3 에서는 JSON으로 CORS 설정이 가능하여 아래 구문을 복사한 뒤 적절히 수정하여 적용한다. [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "PUT", "POST", "DELETE" ], "AllowedOrigins": [ "https://허용할도메인1.com", "http://허용할도메인2.com" ], "ExposeHeaders": [] } ] CORS 설정 (XML) 대부분의 Object Storage 서비스는 S3 CORS 설정 방법과 동일하나, XML 구문만 지원하는 서비스도 간혹 있는데, XML의 경우 아래와 같이 설정한다. <CORSConfiguration> <CORSRule> <AllowedOrigin>https://허용할도메인1.com</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> <CORSRule> <AllowedOrigin>http://허용할도메인2.com</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> </CORSRule> </CORSConfiguration>
AWS SDK 사용을 위한 S3 (Object Storage) 버킷 생성 및 Public 설정 방법
S3 버킷 생성 후 SDK를 통해 외부에서 오브젝트 저장 및 조회를 위해 AWS 콘솔에서 버킷 생성 및 퍼블릭 설정 방법을 안내한다. AWS 회원가입 및 로그인 AWS 웹사이트(https://aws.amazon.com/ko/)에 접속하여 회원가입 후 로그인 AWS S3 신청 및 버킷 생성 AWS 로그인시 Console로 이동되는데, 콘솔 상단좌측 메뉴를 통해 S3 상세 화면으로 이동 S3 버킷 화면 위측에 위치한 [버킷 만들기]를 클릭하여 버킷 생성 화면으로 이동한다. 버킷은 업로드 파일이 저장될 스토리지 공간이며, SDK를 통한 파일 업로드시 해당 버킷에 저장된다. 버킷 생성 화면에서 버킷 이름과 리전을 선택한다. SDK를 사용할 웹서버가 대한민국에 위치해 있다면, ap-northeast를 기본 선택한다. 웹서버와 리전의 거리가 너무 먼 경우 업로드 및 다운로드 속도 저하의 원인이 된다. 스크롤을 내려 퍼블릭 액세스 차단 옵션을 해제한다. 버킷이 퍼블릭으로 설정되어 있어야 외부에서 원격 업/다운로드가 가능한다. 버킷 퍼블릭 권한 정책 설정 생성된 버킷의 퍼블릭 권한 정책을 설정해야 완전한 퍼블릭 버킷으로 설정된다. 방금 생성한 버킷을 클릭하여 상세 설정 화면으로 이동한다. 버킷 설정 화면에서 [권한] 탭을 클릭한다. '버킷 정책'에서 [편집]을 클릭하여 정책 편집 화면으로 이동한다. 정책 입력란에 아래와 같이 정책을 입력 후 저장한다. { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadForGetBucketObjects", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::버킷이름/*" } ] } AWS API 연동을 위한 Access key 및 Secret key 생성 AWS SDK 연동을 위해 키 생성이 필요하다. https://console.aws.amazon.com/iam/home?region=ap-northeast-2#/security_credentials 로 이동 후 새로운 키를 생성한다.
1