2016년 9월 19일 월요일

PHP를 활용하여 Jira Issues 출력해보기

업무에 빈번하게 활용하고 있는 Jira를 내 취향대로 일목요연하게 정리해보고 싶을 때 다음과 같은 방법으로 웹페이지를 만들어 출력해볼수 있습니다.  핵심적인 부분만 샘플로 추려보면

1. Connection 설정
2. Issues 가져오기
3. HTML로 출력하기

순서입니다.

개인적으로 나중에 알아보기 편하려고 function으로 구분해두었는데, 개발자가 아님을 감안하여 봐주시기를 바라겠습니다.


[ JIRA 연결을 위한 초기 세트 ]
  <?php

  function initConnection() {
      $username = 'JIRA유저아이디';
      $password = 'JIRA유저패스워드';

      global $curl;

      $curl = curl_init();
      curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
  }

[ Issues 목록 가져오기 (생성일 순으로 정렬해서 최대 500개) ]
  function listIssues() {
      echo "<table>";
      global $curl, $issues;

      curl_setopt($curl, CURLOPT_URL,
          "http://JIRA서버:8080/rest/api/2/search?startIndex=0&jql=".
          "+order+by+created+asc".
          "&maxResults=500");
  }

[ 가져온 Issues 출력하기 (Summary,Status,Name,Created,Assignee,Reporter과 Comment 내용) ]
  function displayIssues() {
      echo "<table border='-1'>";
      echo "<tr><th width='120'>Issue Number</th>
                <th width='450'>Summary</th>
                <th width='100'>Status</th>
                <th width='100'>Priority</th>
                <th width='200'>Create Date</th>
                <th width='80'>Assignee</th>
                <th width='80'>Reporter</th>
           </tr>";
      global $curl, $issues;

      $issues = json_decode(curl_exec($curl), true);
      foreach ($issues['issues'] as $issue) {
          echo "<tr>";
          echo "<td bgcolor=#eee>"; echo "<a href='"; print_r("http://JIRA서버:8080/browse/".$issue['key']); echo "'>";
              print_r($issue['key']);
          echo "</a></td>";
          echo "<td bgcolor=#eee><b>"; print_r($issue['fields']['summary']); echo "</b></td>";
          echo "<td bgcolor=#ccc><b>"; print_r($issue['fields']['status']['name']); echo "</b></td>";
          echo "<td bgcolor=#eee>"; print_r($issue['fields']['priority']['name']); echo "</td>";
          echo "<td bgcolor=#eee>"; print_r($issue['fields']['created']); echo "</td>";
          echo "<td bgcolor=#eee><b>"; print_r($issue['fields']['assignee']['displayName']); echo "</b></td>";
          echo "<td bgcolor=#eee>"; print_r($issue['fields']['reporter']['displayName']); echo "</td>";
          echo "<tr><td colspan=7>";

          $key = $issue['key'];
          curl_setopt($curl, CURLOPT_URL, "http://JIRA서버:8080/rest/api/2/issue/$key/comment");

          $comments = json_decode(curl_exec($curl), true);

          foreach ($comments['comments'] as $comment) {
              echo "<p>&raquo;&nbsp"; print_r($comment['body']); echo "</p>";
          }
          echo "<font color=#ccc><i>"; print_r($issue['fields']['updated']); echo "</i></font><br>";
          echo "</tr>";
      }
      echo "</table>";
  }

[ 그리고 출력하기 ]
  initConnection();
  listIssues();
  displayIssues();

  ?>


php 파일 하나로 만들어서 호출해보시면 됩니다.  출력 형태를 다양하게 만들어보세요.

2016년 3월 15일 화요일

Amazon NAT Gateway 모니터링

초기 Amazon 환경에서는 NAT AMI EC2로 NAT 시스템을 구축해왔습니다.

[NAT 인스턴스]


그리고 최근들어 Amazon이 NAT Gateway 서비스를 런칭하였고, 사용자들이 차츰 안정성과 관리성을 고려하여 Amazon NAT Gateway 서비스로 전환하고 있는 추세입니다.



이렇게 전환한 NAT 환경 또한 모니터링을 고려해야 할텐데, Flow Logs와 API 명령을 사용해 손쉽게 대비할수 있습니다.

[Flow Logs 소개 및 설정]

Flow Logs를 사용한다면 지정한 프로토콜 및 서비스 상태에 따라 Notification도 가능합니다.

[API 명령 예]
# aws ec2 describe-nat-gateways --output=text --nat-gateway-id nat-xxxxxxxxxxxxxx
※ 상태 (pending | failed | available | deleting | deleted)

또, API 명령을 응용해서 NAT Gateway의 상태도 확인 할수도 있습니다.  응용한다면 각종 모니터링 툴을 통해서 관리할수 있겠네요.


그럼 간단히 API 명령으로 상태를 리턴받는 스크립트를 예로 들어보겠습니다.

[상태 확인 스크립트]
#!/bin/bash
# ./get_natgateway.sh [PROFILE-NAME] [REGION] [NAT-ID]

config=${1}
region=${2}
value=${3}

result=$(
/usr/local/bin/aws ec2 describe-nat-gateways --profile=${config} --region=${region} \
--nat-gateway-id ${value} \
--query 'NatGateways[0].State' \
--output text
)

printf '%s' ${result}

exit 1


무척 간단하네요.  조금 더 고급지게 공유해야 할텐데 시간이 허락치 않아서.. 죄송죄송~


2015년 1월 15일 목요일

AWS CLI를 활용하여 간단히 CloudFront Metric 데이터를 수집

AWS에서 제공하는 mon-get-stats를 통해 데이터를 수집할수 있는데
간혹 Zabbix 또는 Nagios에서 커스터마이징해서 활용할 CloudWatch 체크 스크립트가
필요할때 아래 샘플을 변형하여 사용하실수 있습니다.
간단히 코맨트 해놓을께요.


대상이 ELB일 경우 사용 예
# ./get_cloudwatch.sh [ProfileName] RequestCount 1 60 ap-northeast-1 AWS/ELB Sum LoadBalancerName [ELBName]

대상이 EC2일 경우 사용 예
# ./get_cloudwatch.sh [ProfileName] CPUUtilization 10 300 ap-northeast-1 AWS/EC2 Maximum InstanceId [InstanceName]


#!/bin/bash
export HOME=[PROFILE_HOME_PATH]

config=$1  #프로파일네임
metric=$2  #CloudWatch 매트릭네임
minute=$3  #과거로부터 현재까지 데이터를 수집할 시간
period=$4  #수집 주기
region=$5  #Region
namespace=$6  #CloudWatch 네임스페이스
statistics=  $7  #수집할 Statistics
dimensionkey=$8  #Dimension Key
dimensionvalue=$9  #Dimension Value

result=$(
aws cloudwatch get-metric-statistics --profile ${config} \
--metric-name ${metric} \
--namespace ${namespace} \
--region ${region} \
--start-time `date -u +%Y-%m-%dT%H:%M:%SZ -d "${minute} minute ago"` \
--end-time `date -u +%Y-%m-%dT%H:%M:%SZ` \
--period ${period} \
--statistics ${statistics} \
--dimension "Name=${dimensionkey}, Value=${dimensionvalue}" \
--output text \
| sort -k3 | tail -1 | cut -f 2
)

printf '%.5f' ${result}

exit 1


Return Value를 Float로 해놓았으니 Zabbix 등에서 수집데이터 유형도 Float로 하셔야 합니다.

2014년 10월 31일 금요일

AWS S3에 Bucket 별 접근제어 방법

S3 Web Console을 사용하다보면 부득이하게 사용자별로 S3 접근을 차등하여야 하는 상황을 겪습니다.  그 경우 아래와 같이 Policy를 적용하여 대응이 가능하니 참고하시기 바랍니다.

Web Console S3 메뉴에 접근하였을 때, 전체 Bucket 리스트를 확인할수 있지만 test-bucket 외에는 하위에 Object들을 확인할수 없게 됩니다.


참고
http://docs.aws.amazon.com/IAM/latest/UserGuide/ExampleIAMPolicies.html


설정 예
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::test-bucket",
                "arn:aws:s3:::test-bucket/*"
            ]
        }
    ]
}

2014년 7월 8일 화요일

AWS CloudFront에 인증서 등록 법

AWS CloudFront를 사용자 도메인으로 CNAME 처리하여 서비스할 경우 HTTPS 서비스 제공을 위하여 인증서를 등록해야만 합니다.  다음과 같은 방법으로 인증서를 활성화 할수 있습니다.


설정 환경
- 대상:  Amazon Web Service CloudFront
- 작업:  Amazon Linux



참고
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html#CNAMEsAndHTTPS


인증서 파일 준비
Private Key, Certificate Key, Chain


IAM 권한 부여
"aws iam upload-server-certificate" 명령을 수행할수 있도록 권한 부여


인증서 업로드
# aws iam upload-server-certificate --server-certificate-name sample.com-cloudfront --certificate-body file://sample.crt --private-key file://sample.pem --certificate-chain file://sample.chn --path /cloudfront/sample.com-cloudfront/
{
    "ServerCertificateMetadata": {
        "Path": "/cloudfront/sample.com-cloudfront/",
        "Arn": "arn:aws:iam::789180809293:server-certificate/cloudfront/sample.com-cloudfront/sample.com-cloudfront",
        "ServerCertificateId": "ASCAX782BUD2KSWG23J9H",
        "ServerCertificateName": "sample.com-cloudfront",
        "UploadDate": "2014-05-01T05:22:20.000Z"
    }
}


CloudFront 설정


위와 같이 등록한 인증서를 활성화 하여 사용할수 있습니다.

2014년 7월 7일 월요일

AWS ELB에 사설인증서 등록

일반적인 인터넷 서비스라면 도메인 등록 후 기관에 인증서를 발급받아 설정해야겠지만 사전 테스트와 내부통신 등 AWS ELB에 사설인증서를 등록해야 할 경우 아래와 같은 방법으로 지원할수 있습니다.


설정 환경
- 대상:  Amazon Web Service ELB
- 작업:  Amazon Linux


참고
http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html#upload-cert

 
사설인증서 생성을 위해 OpenSSL 유틸리티 설치
# yum install openssl


개인키 생성
# openssl genrsa -des3 -out sample.pem 1024  <-- des3 암호화 사용하여 1024 비트 키 생성
Enter pass phrase for sample.pem:  <-- 적당한 패스워드 입력


CSR(Certificate Singing Request) 생성
# openssl req -new -key sample.pem -out sample.csr
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:California

Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:

Common Name (eg, your name or your server's hostname) []:www.sample.com 
Email Address []:admin@sample.com
A challenge password []:
An optional company name []:



사설 인증서 생성
# openssl x509 -req -signkey sample.pem -in sample.csr -out sample.crt


ELB 등록을 위해 Passphrase 제거
# openssl rsa -in sample.pem -out temp.pem


Private Key 확인
# cat temp.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDAJRdwc+oAoj4wYVTopo4iL32lbL6JnM3KS2U9zp+d3XhZqxB/
IDVKHtYq466bz/NCTCkbvHW2lxRZv9K5eLu4uU/uN5kG3QX2wZS81XdSdkfeUpNy
x3lgeefzcqWOTPbmLq69Khc94YLxUUiIlRGQLUUkVdjtIQSvZm4oqEYmgQIDAQAB
AoGBAKKrBDP8vh+5O0MEM7kewHfqksnIzWp9aK+ZsuVnlzQz+h6Xt0iYwOS2RIRc
60cX/w6ioa7Mly90qhLtVf4VW34n25ORPRT1WgUz2u/EYrXylUKoK9LaJ8sZkmpK
d/+XiOnDAtBOKPVux5OC/dQTvxDFVKfr9EZP4EC6CwxdDsQBAkEA8d7KMw54Al1M
zKWBXdnvIn/eBG2I07rXundCRD/yXRSsVEEblEKu8ObtL/bqsqVl1KSY+PU7oUBG
76oMBxanYQJBAMtepnwbKlEvHTJ/sc+XxD5X8aBFW70ceXzPsOCTTmCe12UXRgw4
ar+owQ2uEVHzvKjlNrmWwzF0ksqoySNqcyECQHQd+EbQsG66Kg+peVT8NqECcC0C
BQlZDw53CLpJVOq47Q65/yqLZP9EbiRzzzMa0qtmpgYHfawpdqTCp2mTx6ECQEQN
NhSNWom0BEcjp7JZjJd4AiipTNtpLdXwAbYEVNPMEzOGqC/qqP3dUExtlOohb13s
5XUQ19wyr/QUqsmpE0ECQQDhMC1qfmRbi/8TkesdZGuYyvH0yMxPhBrAi36bZ3CJ
M6o8LLujGxHDRKGnHhETN81QBlaDb4D36iPi7Ni7sP8m
-----END RSA PRIVATE KEY-----



Certificate Key 확인
# cat sample.crt
-----BEGIN CERTIFICATE-----
MIICmzCCAgQCCQCUgu8wzkwMMzANBgkqhkiG9w0BAQUFADCBkTELMAkGA1UEBhMC
VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEc
MBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDEXMBUGA1UEAwwOd3d3LnNhbXBs
ZS5jb20xHzAdBgkqhkiG9w0BCQEWEGFkbWluQHNhbXBsZS5jb20wHhcNMTQwNzA4
MDI0NzIwWhcNMTQwODA3MDI0NzIwWjCBkTELMAkGA1UEBhMCVVMxEzARBgNVBAgM
CkNhbGlmb3JuaWExFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UECgwTRGVm
YXVsdCBDb21wYW55IEx0ZDEXMBUGA1UEAwwOd3d3LnNhbXBsZS5jb20xHzAdBgkq
hkiG9w0BCQEWEGFkbWluQHNhbXBsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A
MIGJAoGBAMAlF3Bz6gCiPjBhVOimjiIvfaVsvomczcpLZT3On53deFmrEH8gNUoe
1irjrpvP80JMKRu8dbaXFFm/0rl4u7i5T+43mQbdBfbBlLzVd1J2R95Sk3LHeWB5
5/NypY5M9uYurr0qFz3hgvFRSIiVEZAtRSRV2O0hBK9mbiioRiaBAgMBAAEwDQYJ
KoZIhvcNAQEFBQADgYEAGZLKdvCRZ6RE8zZP8wjjwgpk5Yv4Dyzrni5a6BSpefMk
+Z359FF3ef9jovw1my9QqwEE4TcXRe+4QdZXoZ0ULD6/kSmfSi8zlCLSz1+Op2Ur
MjhRVNTifO6DFnyaTcDndrGy+3qtCmtkZvLdAtqUXhVp4yZ59gmnxp/1rhsYds8=
-----END CERTIFICATE-----



ELB에 인증서 등록
 

위와 같이 Private Key에는 Passphrase를 제거한 temp.pem 내용을, Public Key Certificate에는 사설인증서인 sample.crt 파일의 내용을 등록합니다.