ChaosGraph 라이브러리를 사용하여 AWS S3에서 동적 차트 이미지를 만드는 방법

36046 단어 lambdachaosgraphs3aws
때때로 우리는 웹 페이지의 어떤 부분에 도표를 그려야 하거나, 매일 또는 매달 업무 분석 이미지를 메모리에 저장해야 한다.또한 이러한 이미지를 역사적인 목적으로 AWS S3에서 관리하고자 합니다.
이 점에서 ChaosGraph 라이브러리는 매우 유용한 도구이다.
우리는 API 게이트웨이, Lambda, S3 등 AWS 인프라와 함께 사용된 이러한 용도의 용례를 되돌아볼 것이다...
다음은 우리가 한 용례다.

스크립트


AWS API 게이트웨이에서 요청한 AWS S3 bucket에 대한 차트 이미지를 만들어야 합니다.이를 위해 API 게이트웨이는 REST를 통해 JSON을 도표 데이터 값으로 수신하고 AWS Lambda를 터치하여 도표 이미지를 구축하고 임시 디렉터리에 도표 이미지 파일을 만든 다음 도표 이미지 파일을 S3 메모리 통에 넣습니다.

지금 잠수하라고.


대상 차트의 구성 및 디지털 데이터를 설명하는 JSON 설명자 파일을 만듭니다.다음을 참조하십시오.
{
  "GRAPH" : "LINE",
  "INTERPOLATE" : "SPLINE",
  "WIDTH" : 1600,
  "HEIGHT" : 900,
  "XINDEX" : ["0", "", "2", "", "3", "", "4", "", "5", "", "6", "", "7", "", "8", "", "9", "", "10"],
  "YINDEX" : [50, 80, 500],
  "ELEMENTS" : [
      {
        "ELEMENT" : "Kafka",
        "LABEL" : "Kafka usage",
        "COLOR" : [180,130,130],
        "VALUES" : [44, 35 , 0, 32, 0, 33, 29, 43, 25, 22, 32, 43, 23]
      },
      {
        "ELEMENT" : "elastic search",
        "LABEL" : "elastic search usage",
        "COLOR" : [180,130,130],
        "VALUES" : [43,25,10,32,0,23,52,32,32,23,54,23,48, 20, 60, 140, 500, 10]
      },
      {
        "ELEMENT" : "Oracle",
        "LABEL" : "Oracle usage",
        "COLOR" : [180,180,140],
        "VALUES" : [500,93,0,49,0,24,93,63,92,84,69,46,28]
      },
      {
        "ELEMENT" : "S3",
        "LABEL" : "S3 usage",
        "COLOR" : [150,200,158],
        "VALUES" : [20,36,0,24,22,37,33,54,23,48,53,150,22]
      }
    ]
}
보시다시피 이 JSON 설명자는 도표 유형, 요소 속성, 도표 크기와 삽입값 유형으로 정의됩니다.
우리는 이것을 정의하고 Lambda 함수를 완성했다.Lambda 함수를 배치하고 역할과 권한을 설정합니다.API 게이트웨이, S3도 있습니다.그런 다음 REST-PUT 방법을 사용하여 이 JSON을 사용하여 AWS API 게이트웨이에 요청합니다.

단계 1 - 라이브러리 다운로드

  • Github에서 ChaosGraph Library를 다운로드합니다.액세스 https://github.com/9ins/chaosgraph
  • 프로젝트 클래스 경로에 라이브러리 추가
  • 또는 종속성을 생성 도구 프로필로 설정합니다.
  • Maven 의존


    <!-- https://mvnrepository.com/artifact/io.github.9ins/chaosgraph -->
    <dependency>
        <groupId>io.github.9ins</groupId>
        <artifactId>chaosgraph</artifactId>
        <version>2.0.0</version>
    </dependency>
    

    사다리 의존


    // https://mvnrepository.com/artifact/io.github.9ins/chaosgraph
    implementation group: 'io.github.9ins', name: 'chaosgraph', version: '2.0.0'
    

    2단계 - IDE 도구 구성 방법


    Lambda 함수를 작성하려면 Eclipse나 비주얼 스튜디오와 같은 IDE 코드가 필요합니다. 이 코드들은 Maven, Gradle 같은 구축 도구를 지원합니다. 경험이 있는 도구는 Eclipse와 Gradle를 사용합니다.
  • 종속 설정
  • apply plugin: 'java'
    apply plugin: 'eclipse'
    
    sourceCompatibility = 1.8
    version = '1.0.0'
    jar {
        manifest {
            attributes 'Implementation-Title': 'aws-lambda-chart',
                       'Implementation-Version': version
        }
    }
    
    compileJava.options.encoding = 'utf-8'
    
    tasks.withType(JavaCompile) {
        options.encoding = 'utf-8'
    }
    
    repositories {
        jcenter()
        mavenLocal()  
        mavenCentral()
        flatDir {
            dirs 'libs'
        }
    }
    
    dependencies {  
        // Define AWS SDK dependencies
        compile group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.11.883'
        compile group: 'com.amazonaws', name: 'aws-lambda-java-core', version: '1.2.1'
        compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.11'
    
        // Define ChaosGraph dependencies, downloaded before
        compile files('libs/chaosgraph-2.0.0.jar')
    }
    
    jar {
        doFirst {
            from {
                configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
            }
        }
        exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
    }
    
    보시다시피 Upper Gradle 구축 파일은 AWS SDK와 ChaosGraph의 의존 관계를 정의합니다.

    단계 3 - Lambda 함수 작성 방법


    IDE에서 편집기를 열고 Java 클래스에서 구현된 Lambda "RequestHandler"를 만듭니다.이 이름은 ChartGeneratorHandler입니다.다음 코드를 완성합니다.
    package org.chaostocosmos.aws.lambda;
    
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.Date;
    import java.util.Map;
    
    import org.apache.commons.lang3.exception.ExceptionUtils;
    import org.chaostocosmos.chaosgraph.Graph;
    import org.chaostocosmos.chaosgraph.GraphUtility;
    import org.chaostocosmos.chaosgraph.GraphUtility.CODEC;
    import org.joda.time.LocalDateTime;
    
    import com.amazonaws.regions.Regions;
    import com.amazonaws.services.lambda.runtime.Context;
    import com.amazonaws.services.lambda.runtime.LambdaLogger;
    import com.amazonaws.services.lambda.runtime.RequestHandler;
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.AmazonS3ClientBuilder;
    import com.amazonaws.services.s3.model.ObjectMetadata;
    import com.amazonaws.services.s3.model.PutObjectRequest;
    
    public class ChartGeneratorHandler implements RequestHandler<Map<String, Object>, String> {
    
        Regions clientRegion = Regions.AP_NORTHEAST_2;
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(clientRegion).build();
        String bucketName = "line.chart.image";
    
        @Override
        public String handleRequest(Map<String, Object> event, Context context) {
            String response = null;
            LambdaLogger logger = context.getLogger();
    
            try {
                //Extract body from event
                String requestJson = event.get("body")+"";
    
                //Create graph object from requested JSON to make chart image.
                Graph graph = GraphUtility.createGraphWithJson(requestJson);
                //Get buffered image from chart.
                BufferedImage bi = graph.getBufferedImage();
    
                //Save chart image to file in temp directory.
                String fileObjectKey = "line-chart-"+LocalDateTime.now().toString()+".png";
                File imageFile = new File("/tmp/"+fileObjectKey);
                GraphUtility.saveBufferedImage(bi, imageFile, CODEC.PNG);
    
                // Upload a png image as a new object with ContentType and title specified.
                PutObjectRequest request = new PutObjectRequest(bucketName, fileObjectKey, imageFile);
                ObjectMetadata metadata = new ObjectMetadata();
                metadata.setContentType("image/png");
                metadata.addUserMetadata("title", "line chart");
                request.setMetadata(metadata);
                s3Client.putObject(request);
                response  = new String("{\r\n" + 
                        "  \"statusCode\": 200,\r\n" + 
                        "  \"headers\": {\r\n" + 
                        "    \"Content-Type\": \"application/json\"\r\n" + 
                        "  },\r\n" + 
                        "  \"body\": {\r\n" + 
                        "    \"message\" : \"success\"\r\n" + 
                        "  },\r\n" + 
                        "  \"isBase64Encoded\": false\r\n" + 
                        "}") ;
    
            } catch (Exception ex) {
                response =  new String("Error:"+ex.getMessage());
                response += ExceptionUtils.getStackTrace(ex);
                logger.log(response);
            }
            return response;
        }
    }
    
    Gradle 구축을 실행하여 이 클래스를fatjar로 내보내야 합니다. (모든 라이브러리 항목 포함)

    단계 4 - 차트 이미지 서비스에 대한 IAM 역할 만들기


    API Gateway/Lambda/S3를 처리하려면 IAM 서비스의 Lambda/API Gateway/S3를 관리하는 역할을 만들어야 합니다.이렇게 하려면 AWS 콘솔에 로그인하여 API 게이트웨이, Lambda 및 S3에 대한 역할을 만들어야 합니다.
    다음과 같은 역할이 만들어졌습니다.

    편의를 위해 API 게이트웨이/Lambda/S3의 권한을 FullAccess로 설정합니다.
    신뢰 관계가 상기 세 가지 서비스를 포함하도록 확보하는 것을 잊지 마세요.

    Lambda 및 API 게이트웨이 및 역할에 대한 자세한 설정은 AWS 설명서를 참조하십시오.

    단계 5 - Lambda 함수 만들기,jar 업로드 및 설정


    Lambda에 공작물을 배치하려면 먼저 Lambda 함수를 만들고 이전에 만든 역할을 설정해야 합니다.

    그 다음에 Lambda IDE의'Function code'그룹에서'Action'을 선택하여fatjar 파일을 Lambda 코드 부분에 업로드합니다.

    셋째, Lambda 트리거에 API 게이트웨이를 연결한 다음에 적당한 API 게이트웨이 설정과 역할을 설정한다.

    저희가 만든 것을 이용하여 Lambda IDE 오른쪽에 있는 Lambda 테스트 이벤트 메뉴를 설정하여 테스트를 진행할 수 있습니다.
    이 점과 AWS 서비스에 대한 자세한 구성은 AWS 설명서를 참조하십시오.

    단계 6 - API 게이트웨이를 사용하여 테스트


    이제 API 게이트웨이에 들어가서 REST 방법을 요청할 수 있습니다."테스트"단추만 누르면 됩니다.

    만약 모든 것이 순조롭다면, 너는 아래와 같은 것을 볼 수 있다.

    S3에 폴리라인 이미지를 생성해야 합니다.

    브라우저에서 생성한 폴리라인 그림 이미지를 참조하십시오.

    JSON 설명자 속성을 변경하여 보다 나은 시각적 효과를 얻을 수 있습니다.

    더 많은 값을 표시하기 위해 더 많은 x축 인덱스를 추가했습니다.

    더 많은 기술적 도전에 대해 JSON 설명자를 추가하거나 수정하여 서비스 동적 관리에 더 많은 속성을 포함할 수 있습니다.e, g. S3 bucket 이름 추가, S3 키 접두사 추가...
    ...
          },
          {
            "ELEMENT" : "S3",
            "LABEL" : "S3 usage",
            "COLOR" : [150,200,158],
            "VALUES" : [20,36,0,24,22,37,33,54,23,48,53,150,22, 300, 400, 600, 800]
          }
        ],
        {"S3-BUCKET" : "line.chart.image"},
        {"OBJECT-KEY_PREFIX" : "line_chart_image"}
    }
    

    결론


    AWS는 지속적이고 확장 가능한 인프라를 바탕으로 유연하고 동적인 서비스를 제공합니다.e, g. Lambda, API 게이트웨이, S3 등.
    ChaosGraph는 Java 2D 그래픽으로 차트를 나타내는 유효하고 강력한 라이브러리입니다.
    따라서 우리는 사용자 체험에 사용할 동적 도표 이미지 생성을 만드는 방법을 배웠다.
    이 예는 웹 UI/UX를 만들거나 이미지 아카이브 저장소를 분석하는 데 도움을 줄 수 있습니다...필요한 곳에 두고 싶으세요?
    ChaosGraph에 관심이 있으면 Github wiki 페이지를 방문하십시오: https://github.com/9ins/chaosgraph/wiki.

    좋은 웹페이지 즐겨찾기