<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cloudpark</title>
    <link>https://cloudpark-iolle.tistory.com/</link>
    <description>AWS 구축관련 SRE팀에서 일하고 있습니다.
혹시 aws관련 도움이 필요하시면 info@cloudpark.co.kr로 연락주세요.</description>
    <language>ko</language>
    <pubDate>Fri, 22 May 2026 01:21:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>iolle</managingEditor>
    <item>
      <title>AWS CodePipeline을 이용하여 정적 웹 사이트를 S3에 배포</title>
      <link>https://cloudpark-iolle.tistory.com/16</link>
      <description>&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;AWS CodePipeline을 이용하여 정적 웹 사이트를 S3에 배포&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-28 오후 2.08.18.png&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fi0E8/btsF10zTo6m/RGryn28tMvmupF7TkI4KX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fi0E8/btsF10zTo6m/RGryn28tMvmupF7TkI4KX0/img.png&quot; data-alt=&quot;CodePipeline + S3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fi0E8/btsF10zTo6m/RGryn28tMvmupF7TkI4KX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFi0E8%2FbtsF10zTo6m%2FRGryn28tMvmupF7TkI4KX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;830&quot; height=&quot;337&quot; data-filename=&quot;스크린샷 2024-02-28 오후 2.08.18.png&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CodePipeline + S3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CodePipeline이란?&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot;&gt;소프트웨어 릴리스에 필요한 단계를 모델링, 시각화 및 자동화하는 데 사용할 수 있는 지속적 전달하는 서비스로, &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot;&gt;릴리스 프로세스의 여러 단계를 신속하게 모델링하고 구성할 뿐 아니라 소프트웨어 변경 사항을 지속적으로 릴리스하는 데 필요한 단계를 자동화합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;S3란?&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot;&gt;최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스로, 데이터 레이크, 웹사이트, 모바일 애플리케이션, 백업 및 복원, 아카이브, 엔터프라이즈 애플리케이션, IoT 디바이스, 빅 데이터 분석 등 다양한 사용 사례에서 원하는 양의 데이터를 저장할 뿐 아니라 보호합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;#&amp;nbsp; TL;DR&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CloudFormation 템플릿을 활용하여 CodePipeline과 S3 서비스 구축하여 정적 웹 사이트를 배포합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹사이트 호스트 설정을 한 S3 Bucket을 Management console 상에서 미리 생성한 후에 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub 리포지토리와 CodePipeline과 연동한 후에 git push, merge 를 계기로 vue.js&amp;nbsp;소스코드를 빌드하여 S3 bucket에 배포합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;buildspec.yml을 이용하여 CodeBuild를 정의하며. Cloudformation템플릿으로 CodePipeline.yml을 작성하여 CodePipeline을 정의합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 구축은 아래와 같은 순서로 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CodePipeline 구축 순서&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Codebuild에서 수행할 작업을 정의하는 buildspec.yml 작성&lt;/li&gt;
&lt;li&gt;Cloudformation템플릿(CodePipeline.yml)의 파라미터를 정의한 Parameters.json 작성&lt;/li&gt;
&lt;li&gt;CodePipeline을 구성하기 위한 Cloudformation템플릿(CodePipeline.yml) 작성&lt;/li&gt;
&lt;li&gt;AWS CLI로 CloudFormation 스택 생성&lt;/li&gt;
&lt;li&gt;CodePipeline 실행 테스트&lt;/li&gt;
&lt;li&gt;AWS CLI로 CloudFormation 스택 삭제&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;아키텍처 다이어그램&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;codepipeline_diagram.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fl8L0/btsGce5RwKc/dWXPoucwQYKahRC2WEV940/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fl8L0/btsGce5RwKc/dWXPoucwQYKahRC2WEV940/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fl8L0/btsGce5RwKc/dWXPoucwQYKahRC2WEV940/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFl8L0%2FbtsGce5RwKc%2FdWXPoucwQYKahRC2WEV940%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;401&quot; data-filename=&quot;codepipeline_diagram.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub Repository의 소스 코드를 git clone, 빌드하여 S3 Bucket에 배포하는 다이어그램입니다.&lt;/li&gt;
&lt;li&gt;CodeBuild와 CodePipeline에서 S3 bucket에  엑세스하기 위하여 권한을 부여하는 IAM role이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;CI/CD 파이프라인을 Codepipeline으로 구현하여&amp;nbsp;&lt;/span&gt;GitHub 리포지토리에 있는 소스 코드를 빌드하여 자동으로 S3 bucket으로 배포하는 서비스를 구축합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 56.5116%; height: 108px;&quot; border=&quot;1&quot; data-ke-style=&quot;style4&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;서비스&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;AWS CloudFormation&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;스택 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;AWS IAM&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;액세스 권한 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;AWS S3&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;콘텐츠 배치, 아티팩트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;CodeBuild&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;코드 빌드&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;CodeDeploy&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;코드 배포&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;CodePipeline&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;CI/CD 파이프라인 구축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;GitHub&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;리포지토리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# Codebuild에서 실행하는 작업을 명시하는 buildspec.yml 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711360186587&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 14
  pre_build:
    commands:
      - echo cache clear
      - npm cache clear --force
      - echo npm install
      - npm install 
  build:
    commands:
      - echo code build
      - npm run build
artifacts:  
  files:
    - &quot;**/*&quot;
  base-directory: dist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nodejs : 14 -&amp;gt; nodejs버전을 지정합니다.&lt;/li&gt;
&lt;li&gt;base-directory : dist -&amp;gt;&amp;nbsp; 아티팩트의 base(root)를 빌드한 소스가 저장되는 dist 디렉토리로 지정하며 files:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;**/*&amp;nbsp; 로 dist 디렉토리의 모든 파일을 아티팩터로 저장합니다. codedeploy에서 아티팩터에 저장된 빌드된 소스를 s3 bucket에 배포하기 위하여 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# GitHub와 CodePipeline을 연동&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 AWS Management console에서 Create connection을 통해 GitHub와 CodePipeline을 연동하도록 설정합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;connection 생성한 후엔 ConnectionArn의 값을 메모하여 다음 cloudformation parameter 파일에 추가하도록 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS management console을 통해 GitHub와 CodePipeline 연동하는 방법&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-create-github.html&quot;&gt;https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-create-github.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# Cloudformation작성에 필요한 파라미터  파일 codepipeline.json 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711360186587&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[
    {
      &quot;ParameterKey&quot;: &quot;Env&quot;,
      &quot;ParameterValue&quot;: &quot;dev&quot;
    },
    {
      &quot;ParameterKey&quot;: &quot;Branch&quot;,
      &quot;ParameterValue&quot;: &quot;${git의 branch명}&quot;
    },
    {
        &quot;ParameterKey&quot;: &quot;Repository&quot;,
        &quot;ParameterValue&quot;: &quot;${git의 리포지토리명}&quot;
    },
    {
      &quot;ParameterKey&quot;: &quot;AppBucketName&quot;,
      &quot;ParameterValue&quot;: &quot;${정적웹사이트의 S3 bucket명}&quot;
    },
    {
      &quot;ParameterKey&quot;: &quot;GitConnectionArn&quot;,
      &quot;ParameterValue&quot;: &quot;${ConnectionArn의 값}&quot;
    }
  ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Codepipeline과 연동할 git의 branch명, 리포지토리명, CodeConnetction Arn을 파라미터로 지정합니다.&lt;/li&gt;
&lt;li&gt;미리 생성한  S3 bucket명을 파라미터로 지정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;#&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot;&gt;&lt;span&gt;CodePipeline을 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot;&gt;구성하기 위한&lt;/span&gt; Cloudformation 파일 (codepipeline.yml) 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711360186588&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;AWSTemplateFormatVersion: &quot;2010-09-09&quot;
Description: CodePipeline S3 stack.

# ------------------------------------------------------------
# Parameter
# ------------------------------------------------------------

Parameters:
  Env:
    Type: String
    Default: &quot;dev&quot;
  Branch:
    Type: String
    Default: &quot;&quot;
  Repository:
    Type: String
    Default: &quot;&quot;
  AppBucketName:
    Type: String
    Default: &quot;&quot;
  GitConnectionArn
    Type: String
    Default: &quot;&quot;
    
Resources:
  # ------------------------------------------------------------
  # Artifact용 S3 Bucket
  # ------------------------------------------------------------

  ArtifactBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${Env}-artifact
      VersioningConfiguration:
        Status: Enabled

  # ------------------------------------------------------------
  # CodeBuild
  # ------------------------------------------------------------

  CodeBuild:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: !Sub ${Env}-codebuild
      Source:
        BuildSpec: buildspec.yml
        Type: CODEPIPELINE
      Artifacts:
        Name: !Sub ${Env}-codepipeline
        Packaging: NONE
        Type: CODEPIPELINE
      Cache:
        Type: NO_CACHE
        
      # 환경설정
      Environment:
        ComputeType: BUILD_GENERAL1_SMALL
        Image: aws/codebuild/standard:5.0
        ImagePullCredentialsType: CODEBUILD
        PrivilegedMode: false
        Type: LINUX_CONTAINER
      ServiceRole: !GetAtt CodebuildServiceRole.Arn
      TimeoutInMinutes: 60
      QueuedTimeoutInMinutes: 480
      BadgeEnabled: false

      # 로그 설정
      LogsConfig:
        CloudWatchLogs:
          Status: ENABLED
        S3Logs:
          Status: DISABLED

  # ------------------------------------------------------------
  # CodePipeline
  # ------------------------------------------------------------

  CodePipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      Name: !Sub ${Env}-pipeline
      RoleArn: !GetAtt CodepipelineServiceRole.Arn
      ArtifactStore:
        Location: !Ref ArtifactBucket
        Type: S3
      Stages:
        - Name: Source
          Actions:
            - Name: Source
              ActionTypeId:
                Category: Source
                Owner: AWS
                Provider: CodeStarSourceConnection
                Version: &quot;1&quot;
              Configuration:
                # 브랜치 지정
                BranchName: !Ref Branch
                # github 연동
                ConnectionArn: 
                 - !Ref GitConnectionArn
                # 리포지토리 지정
                FullRepositoryId: !Ref Repository
                OutputArtifactFormat: CODE_ZIP
              OutputArtifacts:
                - Name: SourceArtifact
              Namespace: SourceVariables
              RunOrder: 1
        - Name: Build
          Actions:
            - Name: Build
              ActionTypeId:
                Category: Build
                Owner: AWS
                Provider: CodeBuild
                Version: &quot;1&quot;
              Configuration:
                EnvironmentVariables: !Sub |
                  [
                    {&quot;name&quot;:&quot;STAGE&quot;,&quot;value&quot;:&quot;dev&quot;,&quot;type&quot;:&quot;PLAINTEXT&quot;}
                  ]
                ProjectName: !Ref CodeBuild
              InputArtifacts:
                - Name: SourceArtifact
              OutputArtifacts:
                - Name: BuildArtifact
              Namespace: BuildVariables
              RunOrder: 1
        - Name: Deploy
          Actions:
            - Name: Deploy
              ActionTypeId:
                Category: Deploy
                Owner: AWS
                Provider: S3
                Version: &quot;1&quot;
              Configuration:
                BucketName: !Ref AppBucketName
                Extract: true
              InputArtifacts:
                - Name: BuildArtifact
              Namespace: DeployVariables
              RunOrder: 1
              
  # ------------------------------------------------------------
  # IAM
  # ------------------------------------------------------------

  #### CodeBuild Role 생성
  CodebuildServiceRole:
    Type: AWS::IAM::Role
    Properties:
      Path: /
      RoleName: !Sub ${Env}-codebuild-service-role
      AssumeRolePolicyDocument:
        Version: &quot;2012-10-17&quot;
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - codebuild.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: !Sub ${Env}-build-policy
          PolicyDocument:
            Version: &quot;2012-10-17&quot;
            Statement:
              - Resource:
                  - !GetAtt LogGroup.Arn
                Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
              - Resource:
                  - arn:aws:s3:::codepipeline-ap-northeast-2-*
                  - !Sub arn:aws:s3:::${ArtifactBucket}/
                  - !Sub arn:aws:s3:::${ArtifactBucket}/*
                Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                  - s3:GetObjectVersion
                  - s3:GetBucketAcl
                  - s3:GetBucketLocation
                  - s3:List*
              - Resource:
                  - !Ref ReportGroup
                Effect: Allow
                Action:
                  - codebuild:CreateReportGroup
                  - codebuild:CreateReport
                  - codebuild:UpdateReport
                  - codebuild:BatchPutTestCases
                  - codebuild:BatchPutCodeCoverages

  ### CodePipeline Role 생성
  CodepipelineServiceRole:
    Type: AWS::IAM::Role
    Properties:
      Path: /
      RoleName: !Sub ${Env}-codepipeline-service-role
      AssumeRolePolicyDocument:
        Version: &quot;2012-10-17&quot;
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - codepipeline.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: !Sub ${Env}-codepipeline-base-policy
          PolicyDocument:
            Version: &quot;2012-10-17&quot;
            Statement:
              - Resource:
                  - &quot;*&quot;
                Effect: Allow
                Action: 
                  - codedeploy:CreateDeployment
                  - codedeploy:GetApplicationRevision
                  - codedeploy:GetDeployment
                  - codedeploy:GetDeploymentConfig
                  - codedeploy:RegisterApplicationRevision
              - Resource:
                  - &quot;*&quot;
                Effect: Allow
                Action:
                  - codestar-connections:UseConnection  
              - Resource:
                  - &quot;*&quot;
                Effect: Allow 
                Action: 
                  - s3:*
              - Resource:
                  - &quot;*&quot;
                Effect: Allow 
                Action:
                  - codebuild:BatchGetBuilds
                  - codebuild:StartBuild
              - Resource: &quot;*&quot;
                Effect: Allow
                Action:
                  - servicecatalog:ListProvisioningArtifacts
                  - servicecatalog:CreateProvisioningArtifacts
                  - servicecatalog:DescribeProvisioningArtifacts
                  - servicecatalog:DeleteProvisioningArtifacts
                  - servicecatalog:UpdateProduct

  # ------------------------------------------------------------
  # log-group &amp;amp;&amp;amp; report-group 생성
  # ------------------------------------------------------------

  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub /aws/codebuild/${Env}-codebuild

  ReportGroup:
    Type: AWS::CodeBuild::ReportGroup
    Properties:
      Name: !Sub ${Env}-report-group
      Type: TEST
      ExportConfig:
        ExportConfigType: NO_EXPORT&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;CodePipeline 아티팩트용 S3 Bucket을 생성합니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;Codepipleline과 CodeBuild에는 필요한 IAM role을 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;CodeBuild를 통해 소스 코드 빌드 시 에러 로그를 확인할 수 있도록 로그 그룹을 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# &lt;/b&gt;&lt;b&gt;AWS CLI로 CloudFormation 스택 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711360186590&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 스택생성
$ ENV=dev
$ aws cloudformation create-stack \
  --stack-name &quot;$ENV-stack&quot; \ 
  --template-body file://codepipeline.yml \
  --parameters file://codepipeline.json \
  --capabilities CAPABILITY_NAMED_IAM&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CloudFormation 스택 생성을 위한 AWS CLI는 위 내용과 같이 command를 실행합니다.&lt;/li&gt;
&lt;li&gt;--stack-name에는 생성되는 스택명, --template-body에는 cloudformation template명 , --parameters에는 파라미터의 json을 지정합니다.&lt;/li&gt;
&lt;li&gt;--capabilities의 경우 IAM role생성 시 필수로 적용해야 하는 옵션입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# CodePipeline 실행 테스트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Codepipeline 실행 성공 여부는 Management console의 Codepipeline의&amp;nbsp; Pipelines에서 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-28 오후 6.55.00.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPDT4/btsF2uHxeiW/fy9p2KgO0IfDAezkLt3HwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPDT4/btsF2uHxeiW/fy9p2KgO0IfDAezkLt3HwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPDT4/btsF2uHxeiW/fy9p2KgO0IfDAezkLt3HwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPDT4%2FbtsF2uHxeiW%2Ffy9p2KgO0IfDAezkLt3HwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;377&quot; data-filename=&quot;스크린샷 2024-02-28 오후 6.55.00.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;Git 리포지토리에 있는 소드 코드가 문제없이 성공적으로 업데이트된 화면입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-28 오후 6.51.03.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BVMqz/btsF2uAHxHp/1jgStMuSQn2svKpCJnB440/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BVMqz/btsF2uAHxHp/1jgStMuSQn2svKpCJnB440/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BVMqz/btsF2uAHxHp/1jgStMuSQn2svKpCJnB440/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBVMqz%2FbtsF2uAHxHp%2F1jgStMuSQn2svKpCJnB440%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;343&quot; data-filename=&quot;스크린샷 2024-02-28 오후 6.51.03.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;CodeBuild를 실행된 화면입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-28 오후 6.51.12.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TwOZa/btsF6fn9z6j/8oa343fj9xBsjfpNcbrdEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TwOZa/btsF6fn9z6j/8oa343fj9xBsjfpNcbrdEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TwOZa/btsF6fn9z6j/8oa343fj9xBsjfpNcbrdEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTwOZa%2FbtsF6fn9z6j%2F8oa343fj9xBsjfpNcbrdEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;345&quot; data-filename=&quot;스크린샷 2024-02-28 오후 6.51.12.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;빌드된 소스 코드가 S3 bucket에&amp;nbsp; 성공적으로 배포된 화면입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# AWS CLI로 CloudFormation 스택 삭제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711793650338&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 스택삭제
$ ENV=dev
$ aws cloudformation delete-stack --stack-name &quot;$ENV-stack&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CloudFormation 스택 삭제를 위한 AWS CLI는 상기 command로 삭제합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 요약&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CodePipeline을 활용하면 CI/CD 파이프라인을 쉽게 구축하는 것이 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;CodePipeline을 사용하면 소스 코드가 업데이트될 때마다 자동으로 빌드하고 배포시킬 수 있게 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;CloudFormation을 활용하면 빠르게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt; AWS Service를 구축할 수 있어 유용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;#&amp;nbsp; 참고 공식문서&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S3 Bucket 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot; href=&quot;https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/create-bucket-overview.html&quot;&gt;https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/create-bucket-overview.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711360186591&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/create-bucket-overview.html&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/create-bucket-overview.html&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-description=&quot;객체 잠금을 사용하는 버킷을 생성하려면 s3:CreateBucket, s3:PutBucketVersioning 및 s3:PutBucketObjectLockConfiguration 권한이 있어야 합니다.&quot; data-og-title=&quot;버킷 생성 - Amazon Simple Storage Service&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/create-bucket-overview.html&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/create-bucket-overview.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;버킷 생성 - Amazon Simple Storage Service&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;객체 잠금을 사용하는 버킷을 생성하려면 s3:CreateBucket, s3:PutBucketVersioning 및 s3:PutBucketObjectLockConfiguration 권한이 있어야 합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub 연동 콘솔활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/connections-github.html&quot;&gt;https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/connections-github.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711360186591&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b8imqS/hyVGDzVaPb/fSspaWCziX9aKV2MfHp8mk/img.png?width=792&amp;amp;height=416&amp;amp;face=0_0_792_416,https://scrap.kakaocdn.net/dn/j68fO/hyVDuSauuG/OBzf0lkVo6nsWjkks8xD8K/img.png?width=792&amp;amp;height=335&amp;amp;face=0_0_792_335&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/connections-github.html&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/connections-github.html&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-description=&quot;AWS CLI 또는 AWS CloudFormation을 통해 생성된 연결은 기본적으로 PENDING 상태입니다. CLI 또는 AWS CloudFormation을 사용하여 연결을 생성한 후 콘솔을 통해 연결을 편집하여 상태를 AVAILABLE로 설정합니다.&quot; data-og-title=&quot;GitHub 연결 - AWS CodePipeline&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/connections-github.html&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/connections-github.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b8imqS/hyVGDzVaPb/fSspaWCziX9aKV2MfHp8mk/img.png?width=792&amp;amp;height=416&amp;amp;face=0_0_792_416,https://scrap.kakaocdn.net/dn/j68fO/hyVDuSauuG/OBzf0lkVo6nsWjkks8xD8K/img.png?width=792&amp;amp;height=335&amp;amp;face=0_0_792_335');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;GitHub 연결 - AWS CodePipeline&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;AWS CLI 또는 AWS CloudFormation을 통해 생성된 연결은 기본적으로 PENDING 상태입니다. CLI 또는 AWS CloudFormation을 사용하여 연결을 생성한 후 콘솔을 통해 연결을 편집하여 상태를 AVAILABLE로 설정합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CodePipeline CodestarConnetion 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CodestarConnectionSource.html&quot;&gt;https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CodestarConnectionSource.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711360186591&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CodestarConnectionSource.html&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CodestarConnectionSource.html&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-description=&quot;This feature is not available in the Asia Pacific (Hong Kong), Asia Pacific (Hyderabad), Asia Pacific (Jakarta), Asia Pacific (Melbourne), Asia Pacific (Osaka), Africa (Cape Town), Middle East (Bahrain), Middle East (UAE), Europe (Spain), Europe (Zurich),&quot; data-og-title=&quot;CodeStarSourceConnection for Bitbucket Cloud, GitHub, GitHub Enterprise Server, GitLab.com, and GitLab self-managed actions - AW&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CodestarConnectionSource.html&quot; data-source-url=&quot;https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CodestarConnectionSource.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;CodeStarSourceConnection for Bitbucket Cloud, GitHub, GitHub Enterprise Server, GitLab.com, and GitLab self-managed actions - AW&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;This feature is not available in the Asia Pacific (Hong Kong), Asia Pacific (Hyderabad), Asia Pacific (Jakarta), Asia Pacific (Melbourne), Asia Pacific (Osaka), Africa (Cape Town), Middle East (Bahrain), Middle East (UAE), Europe (Spain), Europe (Zurich),&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CI &amp;amp; CD</category>
      <author>CloudLee</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/16</guid>
      <comments>https://cloudpark-iolle.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 25 Mar 2024 18:50:45 +0900</pubDate>
    </item>
    <item>
      <title>AWS EC2 Instance로 Redmine 5.1.0 구축(Amazonlinux 2023)</title>
      <link>https://cloudpark-iolle.tistory.com/11</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;AWS&amp;nbsp;EC2&amp;nbsp;Instance로&amp;nbsp;Redmine&amp;nbsp;구축(Amazonlinux&amp;nbsp;2023)&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-12 오후 4.04.17.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9dkXP/btsBHPPVSfi/qHXfDd4siRZKanpK1HmfXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9dkXP/btsBHPPVSfi/qHXfDd4siRZKanpK1HmfXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9dkXP/btsBHPPVSfi/qHXfDd4siRZKanpK1HmfXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9dkXP%2FbtsBHPPVSfi%2FqHXfDd4siRZKanpK1HmfXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;326&quot; data-filename=&quot;스크린샷 2023-12-12 오후 4.04.17.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;레드마인(Redmine)이란?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레드마인(Redmine)은 웹 기반의 프로젝트 관리와 버그 추적 기능을 제공하는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;오픈 소스 프로그램입니다.&lt;/span&gt;&amp;nbsp; 소프트웨어 개발 및 여러 협업 작업을 관리하는 데 사용됩니다. Ruby on Rails에 기반하여 작성되었으며, 멀티플랫폼을 지원할 뿐 아니라 여러 가지 종류의 데이터베이스 및 34개의 언어를 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주요 기능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면기반의 관리에 도움이 되도록 달력과 간트 차트를 제공합니다. 일정관리 및 통합된 프로젝트관리가 가능합니다. 이슈추적 및 여러 가지 형상관리 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp; TL;DR&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이번 튜토리얼에서는 AWS EC2로 Redmine 서버를 간단히 구성하고 구축합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;VPC에 Public Subnet 1개만 사용하며, EC2 Instance에 Apache, Redmine과 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;별도로 RDS를 구성하지 않고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; Mysql/MariaDB를 인스톨하는 방법을 소개합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Redmine 서버 액세스 시 default port 3000번을 그대로 사용하며, SSH Client을 통한 EC2 Instance 연결을 위해 port 22번을 허용하는 보안그룹을 구성합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;OS는 &lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: left;&quot;&gt;Amazon Linux 2023을 사용하며, EC2 Instance는 기존에 초기설정을 완료하였던 AMI를 적용한 뒤 시작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: left;&quot;&gt;서버 구축 시 Redmine 5.1.0를 사용하며, Apache 2.4.58, Ruby 3.2.2, Passenger 6.0.19, Mysql/MariaDB 15.1/10.5.20을 사용합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: left;&quot;&gt;Redmine 서버 구성 및 구축은 아래와 같은 순서로 진행합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: left;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;Redmine 서버 구성 및 구축순서&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;Redmine 시스템 사용자 생성&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Apache 서버 설치&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Redmine MariaDB 데이터베이스 설치 및 mysql 사용자 생성&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Redmine 다운로드와 Ruby 및 필수 Package(dependencies) 설치&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Redmine 데이터 베이스 연결 설정 구성&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Ruby Package(dependencies) 설치&lt;/li&gt;
&lt;li&gt;&amp;nbsp;세선 토큰과 스키마 객체 생성&lt;/li&gt;
&lt;li&gt;&amp;nbsp;파일 시스템 권한 구성&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Redmine 설치 테스트&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Apache Passenger module 설치와 Redmine Apache 구성파일 생성 및 수정&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Apache Passenger module 설치 후 포트 확인 및 브라우저 액세스&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp; 개요&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS EC2 Instance에 Redmine을 설치하여 서버를 구성, 구축하는 과정을 설명합니다. 데이터베이스로 MariaDB를 사용하고, Ruby on Rails 및 Passenger와 Apache를 설치하여 사용합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 43.3721%; height: 205px;&quot; border=&quot;1&quot; data-ke-style=&quot;style4&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px;&quot;&gt;&lt;b&gt;이름&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px;&quot;&gt;&lt;b&gt;버전&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px;&quot;&gt;&lt;b&gt;설치&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Redmine&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;5.1.0&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;download&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Apache&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;2.4.58&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;dnf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Ruby&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span&gt;3.2.2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;dnf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Passenger&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span&gt;6.0.19&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;gem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Mysql/MariaDB&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;15.1/10.5.20&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;dnf&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.redmine.org/projects/redmine/wiki/RedmineInstall&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;* 레드마인 설치 시 버전정보 참고 : https://www.redmine.org/projects/redmine/wiki/RedmineInstall&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702371441930&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;RedmineInstall - Redmine&quot; data-og-description=&quot;Installing Redmine&amp;para; This is the installation documentation for Redmine 4.0 and higher. You can still read the document for older versions: 3.x , 1.4.x - 2.6.x, 1.3.x Requirements&amp;para; Operating system&amp;para; Redmine should run on most Unix, Linux, macOS and Windo&quot; data-og-host=&quot;www.redmine.org&quot; data-og-source-url=&quot;https://www.redmine.org/projects/redmine/wiki/RedmineInstall&quot; data-og-url=&quot;https://www.redmine.org/projects/redmine/wiki/RedmineInstall&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.redmine.org/projects/redmine/wiki/RedmineInstall&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.redmine.org/projects/redmine/wiki/RedmineInstall&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RedmineInstall - Redmine&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Installing Redmine&amp;para; This is the installation documentation for Redmine 4.0 and higher. You can still read the document for older versions: 3.x , 1.4.x - 2.6.x, 1.3.x Requirements&amp;para; Operating system&amp;para; Redmine should run on most Unix, Linux, macOS and Windo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.redmine.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# 인프라 구성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-14 오전 11.11.46.png&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7C6D3/btsBY201xjB/UWOVghJLaRNwjQOHK2gGP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7C6D3/btsBY201xjB/UWOVghJLaRNwjQOHK2gGP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7C6D3/btsBY201xjB/UWOVghJLaRNwjQOHK2gGP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7C6D3%2FbtsBY201xjB%2FUWOVghJLaRNwjQOHK2gGP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1135&quot; height=&quot;579&quot; data-filename=&quot;스크린샷 2023-12-14 오전 11.11.46.png&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VPC와 IPv4를 할당하여 Public Subnet을 생성합니다.&lt;/li&gt;
&lt;li&gt;Internet Gateway를 생성하고, Public Subnet과 연결합니다.&lt;/li&gt;
&lt;li&gt;Route tables Routes 대상에 0.0.0.0/0을 추가하고 Internet Gateway를 연결합니다.&lt;/li&gt;
&lt;li&gt;EC2 Instance 시작하여 생성한 VPC, Public Subnet과 연결하고, key pair를 생성한 뒤 다운로드를 진행합니다.&lt;/li&gt;
&lt;li&gt;Security Groups는 Port 22는 MyIP(현재본인아이피)로 3000은 0.0.0.0/0으로 액세스를 허용하도록 구성합니다.&lt;/li&gt;
&lt;li&gt;EC2 Instance에 연결하고 단계적으로 Redmine 설치를 진행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp; Redmine 시스템 사용자 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702451081946&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ useradd -r -m -d /opt/redmine redmine 

# 시스템 사용자 생성확인
$ cat /etc/passwd | grep &quot;redmine&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redmine 설치 시에는 시스템 사용자 생성이 필요합니다. command로는 useradd를 사용합니다. 기본적으로 useradd -r command 만으로 사용자 생성이 가능하지만 별도의 디렉터리에 Redmine을 설치하고 홈 디렉터리로 지정하기기 위해 추가적으로 -m과 -d&amp;nbsp; 옵션을 함께 사용해야 합니다. 시스템 사용자 생성에 필요한 모든 절차가 끝난 후 생성 여부를 재확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp; Apache 서버 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702454076821&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ dnf isntall httpd 

# Apache 버전확인
$ httpd -v

# 시스템 시작 시 자동기동 설정
$ systemctl enable httpd --now

# redmine 그룹에 apache 사용자 추가
usermod -aG redmine apache

# 그룹추가 여부 확인
$ cat /etc/group | grep &quot;redmine&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우선 Apache를 설치합니다. 설치완료되면 버전을 확인하여 설치가 제대로 되었는지 확인합니다. 또한 시스템 시작 시 자동적으로 기동 될 수 있도록 설정합니다. redmine 그룹에 apache 사용자를 추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp;Redmine MariaDB 데이터베이스 설치 및 Mysql 사용자 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702455648868&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su

# mariadb-server 설치 
$ dnf install mariadb-server

# mariadb 자동기동설정
$ systemctl enable --now mariadb&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redmine 데이터베이스 생성을 위해 MariaDB를 설치합니다. Redmine은 PostgerSQL, MS-SAL, SQLite 여러 데이터베이스 백엔드를 지원하기에 선택적으로 진행하는 것이 가능합니다. 설치 후 시스템 부팅 시에는 MariaDB 서버를 시작하고 활성화할 수 있도록 command를 적용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702456812777&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 데이터베이스 보완관련 설정
$ mysql_secure_installation&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 MariaDB 데이터베이스 보안 스크립트를 실행하여 적절하게 보안을 설정하는 것이 필요합니다. 기본 데이터 베이스, 테스트 테이블을 제거해야 합니다. 또한 원격 루트 로그인을 비활성화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702457226292&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# root 암호로 mysql 사용자 접속
$ mysql -u root -p

# 데이터베이스 생성
mysql&amp;gt; create database redminedb;

# 사용자 생성
mysql&amp;gt; grant all on redminedb.* to redmineadmin@localhost identified by 'my-pwd';

# 설정사항 적용
mysql&amp;gt; flush privileges;
mysql&amp;gt; quit&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 백엔드가 설치된 후에는 mysql 사용자로 접속합니다. 접속 후 Redmine용 데이터베이스 및 사용자를 생성한 뒤 데이터베이스 이름을 지정해야 합니다. 생성된 데이터베이스에 대한 모든 권한은 사용자에게 부여하고, 이에 따라 사용자와 비밀번호를 변경합니다. 모든 설정사항이 적용된 후 권한 테이블은 다시 로드하고, 종료합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# Redmine 다운로드와 Ruby 및 필수 Package(dependencies) 설치&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702457949138&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ dnf install ruby-devel \
    rpm-build \
    wget \
    libxml2-devel \
    vim \
    make \
    openssl-devel \
    automake \
    libtool \
    ImageMagick \
    ImageMagick-devel \
    mariadb-devel \
    gcc \
    httpd-devel \
    libcurl-devel \
    gcc-c++ -y

# ruby 버전확인
$ ruby -v&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redmine을 다운로드하게 될 시 빌드에 필요한 다양한 Package(dependencies)들을 설치하는 게 필수입니다. 자동으로 설치되는 Ruby interpreter도 필요합니다. Redmine 버전마다 Ruby 지원 버전이 다르기에 Ruby의 원활한 작동을 위해선 버전을 확인해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702458960751&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ VER=5.1.0

# Redmine 5.1.0 다운로드 및 설치폴더 생성
$ curl -s https://www.redmine.org/releases/redmine-$VER.tar.gz | \
sudo -u redmine tar xz -C /opt/redmine/ --strip-components=1

# Redmine 5.1.0 여러 구성파일 확인
$ ls -alh /opt/redmine&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ruby 버전 지원 여부를 확인한 뒤 공식 페이지로 이동하여 Redmine 5.1.0 압축 파일을 다운로드합니다. 압축해제는 redmine설치를 위해 생성한 /opt/redmine에서 진행합니다. 모든 과정이 끝났을 경우, 여러 구성파일들을 /opt/redmine/ 경로에서 확인할 수 있어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp; Redmine 데이터베이스 연결 설정 구성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702459911666&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ su - redmine

# 여러 구성파일 변경 및 복사
$ cp config/configuration.yml{.example,}
$ cp public/dispatch.fcgi{.example,}
$ cp config/database.yml{.example,}

# 데이터베이스 구성파일 수정
$ vi config/database.yml&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redmine 데이터베이스는 연결 설정 구성을 적절하게 변경하거나 수정해야 합니다. 앞선 과정을 진행하기 위해선 Redmine의 사용자 계정으로 전환하는 것이 필요합니다. 순차적으로 샘플 Redmine 구성파일, public 디렉터리 내에 있는 샘플 디스패치 CGI 구성파일, 샘플 데이터베이스 구성파일의 이름을 변경하고 복사합니다. 샘플 데이터 베이스의 경우, 별도로 데이터베이스 이름, 사용자 및 비밀번호를 앞서 설정한 대로 동일하게 수정한 뒤 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702531168084&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# database.yml 파일구성 및 변경방법
production:
  adapter: mysql2
  database: redminedb # 작성한 database명으로 변경
  host: localhost
  username: redmineadmin # 작성한 mysql 사용자로 변경
  password: &quot;my_pwd&quot;     # 작성한 mysql 사용자의 패스워드로 변경
  # Use &quot;utf8&quot; instead of &quot;utfmb4&quot; for MySQL prior to 5.7.7
  encoding: utf8mb4&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;database.yml 파일 수정 시 다음 구문을 찾아야 합니다. database, username, password는 데이터베이스 및 사용자 생성에서 입력한 대로 변경합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# Ruby Package(dependencies) 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702460540379&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ su - redmine

# bundler 설치
$ gem install bundler

# bundler 구성 옵션 설정
$ bundle config set --local path 'vendor/bundle'
$ bundle config set --local without 'development test'

# dependencies 설치 
$ bundle install&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ruby의 경우에는 여러 Package(dependencies)를 설치하는 것이 필수입니다. Redmine 사용자 계정으로 현재 로그인이 되어 있지 않다면 Redmine 사용자 계정으로 전환하여 진행해야 합니다. 우선적으로 gem Package(dependencies)를 관리하기 위한 bundler를 설치합니다. 완료 후에는 필수 gem Package(dependencies)를 설치하는 것이 가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# 세션 토큰과 스키마 객체 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702463960469&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; $ bundle exec rake generate_secret_token&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 데이터를 저장할 때에는 쿠키의 조정을 방지하는 것이 필요합니다. 이를 위해선 Rails가 쿠키를 인코딩하는 데 사용하는 임의의 비밀 키를 생성해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702463995458&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 데이터베이스 구조를 생성
$ RAILS_ENV=production bundle exec rake db:migrate

# 기본 구성 데이터 투입
$ RAILS_ENV=production REDMINE_LANG=en bundle exec rake redmine:load_default_data&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;스키마 객체 생성 시 Rails 데이터베이스 구조를 생성하기 위해 데이터베이스 마이그레이션을 진행해야 합니다. 완료 후 기본 구성 데이터를 데이터베이스에 투입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp; 파일 시스템 권한 구성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702464011998&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ for i in tmp tmp/pdf public/plugin_assets; do [ -d $i ] || mkdir -p $i; done

# 소유자와 그룹 변경
$ chown -R redmine:redmine files log tmp public/plugin_assets

# user 외 755 권한부여
$ chmod -R 755 /opt/redmine/&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;Redmine 디렉터리 /opt/redmine에서 tmp, tmp/pdf, public and public/plugin_assets, log 디렉터리가 생성되어 있는지 확인하는 것이 필요합니다. 존재하지 않는 파일이 있는 경우에는 생성한 뒤, 소유자와 그룹, 권한 확인하여 Redmine을 실행하는 데 사용된 사용자로 모두 변경합니다.&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;background-color: #000000; text-align: center;&quot; data-ez-name=&quot;kifarunix_com-mobile-leaderboard-1&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp; Redmine 설치 테스트&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702464025744&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ su - redmine

# Gemfile에 webric 추가
$ echo 'gem &quot;webrick&quot;' &amp;gt;&amp;gt; Gemfile
$ bundle install

# Redmine 서버 설치 테스트
$ bundle exec rails server -u webrick -e production&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;Redmine 설정이 완료된 뒤에는 &lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot;&gt;WEBrick을 사용하여 Redmine을 테스트하는 것이 가능합니다. 우선 Redmine 사용자로 변경한 후, Gemfile에 webrick을 추가합니다. Webrick gem을 설치하고 설치 테스트를 실시합니다. 샘플 출력 후에는 &lt;b&gt;http://Server-IP:3000/&amp;nbsp;&lt;/b&gt;해당 주소를 사용하여 Redmine에 액세스 하는 것이 가능합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702521037087&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 샘플 출력
=&amp;gt; Booting WEBrick
=&amp;gt; Rails 6.1.7.6 application starting in production http://0.0.0.0:3000
=&amp;gt; Run `bin/rails server --help` for more startup options
[2023-11-13 08:03:05] INFO  WEBrick 1.8.1
[2023-11-13 08:03:05] INFO  ruby 3.2.2 (2023-03-30) [x86_64-linux]
[2023-11-13 08:03:05] INFO  WEBrick::HTTPServer#start: pid=4022 port=3000&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;WEBrick을 통해 웹서버 Instance를 실행하기 위해서는 샘플 출력 내용을 확인하는 것이 중요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# Apache Passenger module 설치와 Redmine Apache 구성파일 생성 및 수정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702464065537&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ su - redmine
$ gem install passenger --no-document

# passenger-install-apache2-module 경우, 설치 가이드를 따라 Phusion Passenger를 설치
$ passenger-install-apache2-module&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Passenger module 설치는 redmine 사용자 계정으로 진행해야 합니다. 설치 후에는 그에 따라 버전을 교체하는 것이&amp;nbsp; 필요합니다. 설치 가이드에 따라 진행해야 하며, 언어의 경우에는 Ruby를 선택합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;passenger-install-apache2-module 완료 후에는 모듈 구성방법이 제공되므로 해당 내용대로 redmine.conf 파일을 수정해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702464078114&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ vi /etc/httpd/conf.d/redmine.conf&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apache 설정파일을 수정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702520502351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# redmine.conf 파일구성 
&amp;lt;IfModule mod_passenger.c&amp;gt;
  PassengerRoot /opt/redmine/.local/share/gem/ruby/gems/passenger-6.0.18
  PassengerDefaultRuby /usr/bin/ruby
&amp;lt;/IfModule&amp;gt;
&amp;lt;VirtualHost *:3000&amp;gt;
    ServerName {server-IP-or-Hostname}
    DocumentRoot &quot;/opt/redmine/public&quot; 

    CustomLog logs/redmine_access.log combined
    ErrorLog logs/redmine_error_log
    LogLevel warn

    &amp;lt;Directory &quot;/opt/redmine/public&quot;&amp;gt;
        Options Indexes ExecCGI FollowSymLinks
        Require all granted
        AllowOverride all
    &amp;lt;/Directory&amp;gt;
&amp;lt;/VirtualHost&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;IfModule mod_passenger.c&amp;gt;.. &amp;lt;/IfModule&amp;gt; 부분은 passenger-install-apache2-module 완료 후 표시되는 내용대로 작성해 주는 것이 중요합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702543890960&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 구성구문 재확인 
$ passenger-install-apache2-module --snippet

# Syntax 확인
$ httpd -t

$ systemctl restart httpd.service&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구성 구문이 재확인하려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;passenger-install-apache2-module --snippet를 사용합니다. redmine.conf 파일을 수정하고 저장한 뒤에는 httpd -t로 에러가 없는지 확인합니다. redmine.conf를 수정하였으므로 Apache를 재기동해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;#&amp;nbsp; Apache Passenger module 설치 후 포트 확인 및 브라우저 액세스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702464089801&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su
$ su - redmine

# 포트확인
$ ss -altnp&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;Redmine 서버에 액세스 하기에 앞서 redmine 사용자 계정으로 전환합니다. command를 통해 포트&amp;nbsp; 3000에 수신 대기 중인 항목이 있는지 확인해야 합니다. 브라우저를 통해 Redmine 액세스 시에는 &amp;nbsp;&lt;b&gt;http://server-IP-or-Hostname:3000&lt;/b&gt; 주소를 입력하여 Redmine이 표시되는지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Redmine</category>
      <author>CloudLee</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/11</guid>
      <comments>https://cloudpark-iolle.tistory.com/11#entry11comment</comments>
      <pubDate>Tue, 12 Dec 2023 16:14:26 +0900</pubDate>
    </item>
    <item>
      <title>RDS (Aurora for Mysql) &amp;nbsp;운영 방법</title>
      <link>https://cloudpark-iolle.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에서 RDS를 운영하다 보면 Master RDS 와 Read Replica RDS 로 2대구성으로 운영을 하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어플리케이션에서 select sql 은 Read Replica RDS로 Insert, Update sql 은 Master RDS로 실행하면 가장 좋지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Split하는 방법을 애플리케이션쪽에서 하지 않고 인프라쪽에서 하는 방법이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Split이란 Select Sql은 Read Relica로 Insert, Update Sql은 Master에서 실행하도록 Sql를 나누어 주는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;heimdal database proxy 를 이용하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 내용은 아래 AWS 블로그에 자세하게 설명되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/apn/using-the-heimdall-proxy-to-split-reads-and-writes-for-amazon-aurora-and-amazon-rds/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://aws.amazon.com/ko/blogs/apn/using-the-heimdall-proxy-to-split-reads-and-writes-for-amazon-aurora-and-amazon-rds/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657965740179&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Using the Heimdall Proxy to Split Reads and Writes for Amazon Aurora and Amazon RDS | Amazon Web Services&quot; data-og-description=&quot;Horizontally scaling a SQL database involves separating the write-master from read-only servers. This allows the write server to perform dedicated write operations rather than processing redundant read queries. However, writing to one node and reading from&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/blogs/apn/using-the-heimdall-proxy-to-split-reads-and-writes-for-amazon-aurora-and-amazon-rds/&quot; data-og-url=&quot;https://aws.amazon.com/blogs/apn/using-the-heimdall-proxy-to-split-reads-and-writes-for-amazon-aurora-and-amazon-rds/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btH04N/hyO5HcUmWd/GlSsVuQYha9OqSZoO1t2I1/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/uQcQj/hyO5P9PiOZ/U2PETI1rbTdzL1KfJku0nk/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/chgYkL/hyO7HWDtvt/7GeDsOWrk0fEcKodIoRH71/img.png?width=1365&amp;amp;height=1172&amp;amp;face=0_0_1365_1172&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/apn/using-the-heimdall-proxy-to-split-reads-and-writes-for-amazon-aurora-and-amazon-rds/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/blogs/apn/using-the-heimdall-proxy-to-split-reads-and-writes-for-amazon-aurora-and-amazon-rds/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btH04N/hyO5HcUmWd/GlSsVuQYha9OqSZoO1t2I1/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/uQcQj/hyO5P9PiOZ/U2PETI1rbTdzL1KfJku0nk/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/chgYkL/hyO7HWDtvt/7GeDsOWrk0fEcKodIoRH71/img.png?width=1365&amp;amp;height=1172&amp;amp;face=0_0_1365_1172');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Using the Heimdall Proxy to Split Reads and Writes for Amazon Aurora and Amazon RDS | Amazon Web Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Horizontally scaling a SQL database involves separating the write-master from read-only servers. This allows the write server to perform dedicated write operations rather than processing redundant read queries. However, writing to one node and reading from&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SSM Change Calendar + Eventbridge Rule를 이용한 RDS Auto ScaleUp / ScaleDown&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 SQL Split를 이용하지 않고 RDS 를 Scale Up하는 방법도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 운영하는 쪽에서는 아침 6시30분에 Read Replica 를 Scale Up해서 Failover하여 Read Replica -&amp;gt; Master로 승격하여 운영하다가 저녁 9시에 Failover하여 Read Replica (원래 Master) -&amp;gt; Master로 승격시키고 원래 Read Replica 를 Scale Down 하여 운영하고 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eventbridge Rule 의 Failover ( Reader를 Master로 승격 ) Cron설정 (월 ~ 금 아침 6시 30분 실행)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1661582619400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cron(30 21 ? * SUN-THU *)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eventbridge Rule 의 Failback ( Master를 Reader로 강등 ) Cron설정 (월 ~ 금 저녁 9시 00분 실행)&lt;/p&gt;
&lt;pre id=&quot;code_1661582820870&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cron(0 12 ? * MON-FRI *)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Eventbridge Rule&lt;span&gt; 시간은 전부 UTC로 설정합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eventbridge Rule를 사용하면 Cron 설정으로 월~금만 Scale Up하게끔 할 수 있지만 공휴일인 경우에는 Scale Up하지 않도록 매번 수동으로 Eventbridge Rule를 Diable해야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 자동으로 공휴일에도 Scale Up되지 않도록 Cron 설정만으로는 안되고 캘린더랑 연동할 수 있는 방법이 있지 않을까 해서 찾은게&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SSM Change Calendar 라는 서비스가 있었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자세한 내용은 &lt;a href=&quot;https://cloudpark-iolle.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cloudpark-iolle.tistory.com/8&lt;/a&gt;&amp;nbsp;를 참조해 주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최종적으로 SSM Change Calendar(holiday-calendar) -&amp;gt; Lambda(calendar-event rule) -&amp;gt; Eventbridge Rule(failoverrule-diable lambda) -&amp;gt; EventBridge Rule (rds-failover rule) -&amp;gt; Lambda(&lt;span style=&quot;background-color: #ffffff;&quot;&gt;rds-auto-failover) -&amp;gt; RDS 로 이어지는 구성이 됩니다.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최종 Diagram&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;RDS_Failover Auto.png&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/82QJC/btrKHw70C1a/J4qcUMEHYsfw4KtCVTTfR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/82QJC/btrKHw70C1a/J4qcUMEHYsfw4KtCVTTfR1/img.png&quot; data-alt=&quot;RDS Auto Failover by Calendar&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/82QJC/btrKHw70C1a/J4qcUMEHYsfw4KtCVTTfR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F82QJC%2FbtrKHw70C1a%2FJ4qcUMEHYsfw4KtCVTTfR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1397&quot; height=&quot;842&quot; data-filename=&quot;RDS_Failover Auto.png&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RDS Auto Failover by Calendar&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 RDS의 Size가 크면 클수록 ScaleUp / ScaleDown 실행시 Lambda 실행시간(15분)을 초과하는 경우가 있을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 EventBridge Rule(rds-event rule)를 설정하여 Lambda는 ScaleUp만 실행시키고 종료하고 EventBridge Rule(rds-event &lt;span style=&quot;color: #000000;&quot;&gt;rule)로 RDS Event를 캐치하여 Failover / Failback를 실행하도록 Lambda를 기동시키도록 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RDS Event로는&amp;nbsp;&lt;/span&gt;RDS-EVENT-0014 (&lt;span style=&quot;background-color: #ffffff;&quot;&gt;InstanceClassModifyEndEventID) 와 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;RDS-EVENT-0071 (&lt;span style=&quot;background-color: #ffffff;&quot;&gt;FailOverEndEventID&lt;/span&gt;)만 감시하도록 했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Event Flow&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;RDS_Failvoer_Event_Flow.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;1407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VQyys/btrKGQ6Y54a/D9uNEvJzEkce6EP4aRDfk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VQyys/btrKGQ6Y54a/D9uNEvJzEkce6EP4aRDfk1/img.png&quot; data-alt=&quot;RDS Event Flow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VQyys/btrKGQ6Y54a/D9uNEvJzEkce6EP4aRDfk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVQyys%2FbtrKGQ6Y54a%2FD9uNEvJzEkce6EP4aRDfk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;1407&quot; data-filename=&quot;RDS_Failvoer_Event_Flow.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;1407&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RDS Event Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Architecture</category>
      <author>iolle</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/9</guid>
      <comments>https://cloudpark-iolle.tistory.com/9#entry9comment</comments>
      <pubDate>Sat, 16 Jul 2022 19:42:23 +0900</pubDate>
    </item>
    <item>
      <title>AWS Systems Manager Change Calendar를 사용하여 완전 자동화를  실현</title>
      <link>https://cloudpark-iolle.tistory.com/8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aws-ssm.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhn6bi/btrEuXwGacf/pgdpVpS28Ju6ngKv6ZgOP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhn6bi/btrEuXwGacf/pgdpVpS28Ju6ngKv6ZgOP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhn6bi/btrEuXwGacf/pgdpVpS28Ju6ngKv6ZgOP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhn6bi%2FbtrEuXwGacf%2FpgdpVpS28Ju6ngKv6ZgOP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;630&quot; data-filename=&quot;aws-ssm.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL; DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Change Calendar는&amp;nbsp; AWS에서 사용하는 캘린더&lt;/li&gt;
&lt;li&gt;iCalendar형식&lt;/li&gt;
&lt;li&gt;EventBridge와 연동 가능&lt;/li&gt;
&lt;li&gt;캘린더 스케줄로 AWS 리소스 실행예약이 가능&lt;/li&gt;
&lt;li&gt;cron 설정으로는 불가능한 스케줄 실행이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SSM Change Calendar&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 에서 만들 수 있는 캘린더이면서&amp;nbsp;&lt;br /&gt;Systems Manager에서 Automation 과 RunCommand 를 실행할 때에 실행하는 날과 실행하지 않는 날을 캘린더로 지정할 수 있습니다. 예를 들어 개발환경의 EC2 인스턴스를 자동으로 업무시간외 공휴일에도 자동으로 정지시킬 수 있습니다.&lt;br /&gt;&lt;b&gt;기존&amp;nbsp;EventBridge&amp;nbsp;Rule에서는&amp;nbsp;cron설정으로&amp;nbsp;지정된&amp;nbsp;시간,&amp;nbsp;지정된&amp;nbsp;요일,&amp;nbsp;지정된&amp;nbsp;날짜&amp;nbsp;만&amp;nbsp;설정된다는&amp;nbsp;단점을&amp;nbsp;Change&amp;nbsp;Calendar를&amp;nbsp;사용하면&amp;nbsp;cron설정에&amp;nbsp;더하여&amp;nbsp;공휴일을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공휴일을 일일히 지정하지 않고도&amp;nbsp; google calendar를 Change Calendar를 만들 때에 import할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;google calendar의 한국의 공휴일 ical 다운로드는 아래 링크로 다운로드할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1654861527139&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://calendar.google.com/calendar/ical/ko.south_korea%23holiday%40group.v.calendar.google.com/public/basic.ics&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Change&amp;nbsp;Calendar&amp;nbsp;다음&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;유형이&amp;nbsp;있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DEFAULT_OPEN 또는 Open by default&lt;/b&gt;&lt;br /&gt;Open(허가)된 상태가 표준이 되며 Close(거부)할 수 있는 기간을 지정합니다. 예를 들어 EventBridge Rule를 캘린더에서 지정된 기간동안 Disable상태로 만들 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSM-CCal-OpenCal-v5.png&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CZ295/btrDEIuclyY/K4DuBoNvkqyNUFe7QLLzH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CZ295/btrDEIuclyY/K4DuBoNvkqyNUFe7QLLzH0/img.png&quot; data-alt=&quot;Default Open&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CZ295/btrDEIuclyY/K4DuBoNvkqyNUFe7QLLzH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCZ295%2FbtrDEIuclyY%2FK4DuBoNvkqyNUFe7QLLzH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;652&quot; data-filename=&quot;SSM-CCal-OpenCal-v5.png&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Default Open&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DEFAULT_CLOSED 또는 Closed by default&lt;/b&gt;&lt;br /&gt;Close(거부)된&amp;nbsp;상태가&amp;nbsp;표준이&amp;nbsp;되며&amp;nbsp;Open(허가)할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기간을&amp;nbsp;지정합니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;EventBridge&amp;nbsp;Rule를&amp;nbsp;캘린더에서&amp;nbsp;지정된&amp;nbsp;기간동안&amp;nbsp;Enable상태로&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSM-CCal-ClosedCal-v5.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by4EgW/btrDFwthu3k/hkv3d9vHw6ZDyhkgPxhMIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by4EgW/btrDFwthu3k/hkv3d9vHw6ZDyhkgPxhMIK/img.png&quot; data-alt=&quot;Default Close&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by4EgW/btrDFwthu3k/hkv3d9vHw6ZDyhkgPxhMIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby4EgW%2FbtrDFwthu3k%2Fhkv3d9vHw6ZDyhkgPxhMIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;652&quot; data-filename=&quot;SSM-CCal-ClosedCal-v5.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Default Close&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인용&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://aws.amazon.com/jp/blogs/mt/using-aws-systems-manager-change-calendar-to-prevent-changes-during-critical-events/&quot;&gt;https://aws.amazon.com/jp/blogs/mt/using-aws-systems-manager-change-calendar-to-prevent-changes-during-critical-events/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654861302008&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Using AWS Systems Manager Change Calendar to prevent changes during critical events | Amazon Web Services&quot; data-og-description=&quot;When applications and their development teams grow or evolve around service-specific independent teams, coordination and visibility among projects, deployments and operational events become a critical issue. AWS customers use multiple AWS accounts for many&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/jp/blogs/mt/using-aws-systems-manager-change-calendar-to-prevent-changes-during-critical-events/&quot; data-og-url=&quot;https://aws.amazon.com/blogs/mt/using-aws-systems-manager-change-calendar-to-prevent-changes-during-critical-events/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Sr3JB/hyOId3XoEY/eybdi7uIfkWEUR8MjBmij1/img.png?width=768&amp;amp;height=385&amp;amp;face=0_0_768_385,https://scrap.kakaocdn.net/dn/TbvQ2/hyOIeu1nt2/gKiHEmBcLFZX8T80VrVVb0/img.png?width=768&amp;amp;height=385&amp;amp;face=0_0_768_385,https://scrap.kakaocdn.net/dn/bweNlR/hyOIaTFO5P/aRHGZwvqnHnQ0kijFSnOc1/img.png?width=1472&amp;amp;height=1470&amp;amp;face=0_0_1472_1470&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/jp/blogs/mt/using-aws-systems-manager-change-calendar-to-prevent-changes-during-critical-events/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/jp/blogs/mt/using-aws-systems-manager-change-calendar-to-prevent-changes-during-critical-events/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Sr3JB/hyOId3XoEY/eybdi7uIfkWEUR8MjBmij1/img.png?width=768&amp;amp;height=385&amp;amp;face=0_0_768_385,https://scrap.kakaocdn.net/dn/TbvQ2/hyOIeu1nt2/gKiHEmBcLFZX8T80VrVVb0/img.png?width=768&amp;amp;height=385&amp;amp;face=0_0_768_385,https://scrap.kakaocdn.net/dn/bweNlR/hyOIaTFO5P/aRHGZwvqnHnQ0kijFSnOc1/img.png?width=1472&amp;amp;height=1470&amp;amp;face=0_0_1472_1470');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Using AWS Systems Manager Change Calendar to prevent changes during critical events | Amazon Web Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;When applications and their development teams grow or evolve around service-specific independent teams, coordination and visibility among projects, deployments and operational events become a critical issue. AWS customers use multiple AWS accounts for many&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;다음에는 Change Calendar를 사용하여 RDS (Aurora for Mysql) 를 운영하는 방법을 소개하겠습니다.&lt;/h4&gt;</description>
      <category>AWS Component</category>
      <author>iolle</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/8</guid>
      <comments>https://cloudpark-iolle.tistory.com/8#entry8comment</comments>
      <pubDate>Fri, 27 May 2022 22:06:49 +0900</pubDate>
    </item>
    <item>
      <title>2020년 9월 30일이후 생성된 S3 Bucket에 대하여 path style의 S3 API Request가 중지됩니다</title>
      <link>https://cloudpark-iolle.tistory.com/7</link>
      <description>&lt;p&gt;공식 블로그&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/korea/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot;&gt;https://aws.amazon.com/ko/blogs/korea/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1597917994049&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Amazon S3 경로 기반 API 사용 중지 계획 안내 | Amazon Web Services&quot; data-og-description=&quot;지난 주 저희는 Amazon S3 버킷에 있는 객체의 주소를 지정하는 데 사용되는 경로 기반 액세스 모델을 중지할 것임을 발표했습니다. 이 블로그 게시물을 작성하기 위해 저는 현 상황에 대해 S3 팀과&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/blogs/korea/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot; data-og-url=&quot;https://aws.amazon.com/ko/blogs/korea/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cf493u/hyHdo5CYkg/AeDHZs4LN7Cm6J9AhElzuk/img.jpg?width=390&amp;amp;height=249&amp;amp;face=0_0_390_249,https://scrap.kakaocdn.net/dn/KrDyu/hyHdAEX2zt/iyGxHaMulHMOIOdJS2TbqK/img.jpg?width=390&amp;amp;height=249&amp;amp;face=0_0_390_249,https://scrap.kakaocdn.net/dn/cXJYzR/hyG1FATGdd/Lkz7RAT8QBHcx3m1vI91mk/img.jpg?width=390&amp;amp;height=312&amp;amp;face=0_0_390_312&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/korea/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/blogs/korea/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cf493u/hyHdo5CYkg/AeDHZs4LN7Cm6J9AhElzuk/img.jpg?width=390&amp;amp;height=249&amp;amp;face=0_0_390_249,https://scrap.kakaocdn.net/dn/KrDyu/hyHdAEX2zt/iyGxHaMulHMOIOdJS2TbqK/img.jpg?width=390&amp;amp;height=249&amp;amp;face=0_0_390_249,https://scrap.kakaocdn.net/dn/cXJYzR/hyG1FATGdd/Lkz7RAT8QBHcx3m1vI91mk/img.jpg?width=390&amp;amp;height=312&amp;amp;face=0_0_390_312');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Amazon S3 경로 기반 API 사용 중지 계획 안내 | Amazon Web Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;지난 주 저희는 Amazon S3 버킷에 있는 객체의 주소를 지정하는 데 사용되는 경로 기반 액세스 모델을 중지할 것임을 발표했습니다. 이 블로그 게시물을 작성하기 위해 저는 현 상황에 대해 S3 팀과&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;S3 Endpoint 지정방법&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;패스 형식(path-style)&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;V1이라고 불림&lt;/p&gt;
&lt;p&gt;패스부분에 버킷명이 들어감&lt;/p&gt;
&lt;pre id=&quot;code_1597918227365&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://s3.amazonaws.com/&amp;lt;bucket-name&amp;gt;(버지니아 리전만 가능)
http://s3-ap-northeast-2.amazonaws.com/&amp;lt;bucket-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가상호스트 형식(virtual hosted-style)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;V2이라고 불림&lt;/p&gt;
&lt;p&gt;호스트명에 버킷명이 들어감&lt;/p&gt;
&lt;pre id=&quot;code_1597918309705&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://&amp;lt;bucket-name&amp;gt;.s3.amazonaws.com
http://&amp;lt;bucket-name&amp;gt;.s3-ap-northeast-2.amazonaws.com&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2020년9월30일이후에 생성된 버킷에 대하여 가상호스트형식만 허용됩니다.&lt;/p&gt;
&lt;p&gt;따라서 2020년 9월 30일 이전에 생성된 버킷에 대해서는 가상호스트형식 뿐만 아니라 패스형식으로도 억세스가 가능합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;앞으로는 가상호스트 형식만 가능하므로 sdk를 이용하거나 버킷을 생성할때에 주의할 점이 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;aws-sdk-php 이용시 주의할 점&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;최신 SDK를 이용하면 되지만 프로그램 상에 &lt;span style=&quot;color: #333333;&quot;&gt;use_path_style_endpoint가 false로 되어있는지를 확인해 볼 필요가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html&quot;&gt;https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1597919232054&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Class Aws\S3\S3Client | AWS SDK for PHP 3.x&quot; data-og-description=&quot;Aws\AwsClient implements Aws\AwsClientInterface uses Aws\AwsClientTrait Aws\S3\S3Client implements Aws\S3\S3ClientInterface uses Aws\S3\S3ClientTrait Namespace: Aws\S3 Located at S3/S3Client.php Client used to interact with Amazon Simple Storage Service (A&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Class Aws\S3\S3Client | AWS SDK for PHP 3.x&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Aws\AwsClient implements Aws\AwsClientInterface uses Aws\AwsClientTrait Aws\S3\S3Client implements Aws\S3\S3ClientInterface uses Aws\S3\S3ClientTrait Namespace: Aws\S3 Located at S3/S3Client.php Client used to interact with Amazon Simple Storage Service (A&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;버킷 생성시 주의할 점&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;under score ( _ ) 사용금지&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;버킷 생성시에 under score가 입력되지 않습니다만, 이전에 생성해둔 버킷명에 포함되어 있는지 확인해볼 필요가 있습니다. &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;under score는 호스트명에 사용할 수 없으므로 호스트형식으로 변경되면 접근할 수 없습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대문자 사용금지&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;under score와 마찬가지로 &lt;/span&gt;버킷 생성시에 대문자가 입력되지 않습니다만, &lt;span style=&quot;color: #333333;&quot;&gt;이전에 생성해둔 버킷명에 포함되어 있는지 확인해볼 필요가 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; 대문자는 호스트명에서 소문자로 바뀌게 되므로 주의할 필요가 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;period 사용금지&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;under score와 대문자와 마찬가지로 period(마침표)를 버킷명에 사용할 수 없습니다. 버킷에 억세스할때 https로 억세스하기 때문에 &lt;b&gt;*.s3.amazonaws.com &lt;/b&gt;도메인의 SSL증명서를 사용할 수 없게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;버킷명에 대한 공식 문서&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/BucketRestrictions.html&quot;&gt;https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/BucketRestrictions.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>AWS Component</category>
      <category>s3 #가상호스트형식 #2020-09-30 #패스형식 #virtual-hosted-style #path-style</category>
      <author>iolle</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/7</guid>
      <comments>https://cloudpark-iolle.tistory.com/7#entry7comment</comments>
      <pubDate>Thu, 20 Aug 2020 19:45:23 +0900</pubDate>
    </item>
    <item>
      <title>fluentd를 이용하여 S3로 로그전송시 불필요한 Get Request를 없애는 방법</title>
      <link>https://cloudpark-iolle.tistory.com/6</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Fluentd_horizontal.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;340&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DTkjl/btqFUSQd0Q9/NdGgPuy0LDBKtmmtNTY9s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DTkjl/btqFUSQd0Q9/NdGgPuy0LDBKtmmtNTY9s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DTkjl/btqFUSQd0Q9/NdGgPuy0LDBKtmmtNTY9s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDTkjl%2FbtqFUSQd0Q9%2FNdGgPuy0LDBKtmmtNTY9s0%2Fimg.png&quot; data-filename=&quot;Fluentd_horizontal.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;340&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Fluentd를 이용하여 S3로 로그를 전송할 때에 다음과 같은 설정을 사용하면 불필요한 Get Request가 발생하게 됩니다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1595492442052&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;check_object true (default true)
s3_object_key_format 에서 %{index}를 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;상기 설정으로 S3에 저장되는 로그파일은 로그파일명_0.txt, 로그파일명_1.&lt;span style=&quot;color: #333333;&quot;&gt;txt &lt;/span&gt;형식으로 번호가 자동적으로 부여되면서 저장되게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;제 경우에는 60초마다 로그를 전송하는데 1시간에 60개의 로그파일이 저장되고 24시간이면 1440개의 로그파일이 저장됩니다. 마찬가지로 로그파일명_0.&lt;span style=&quot;color: #333333;&quot;&gt;txt &lt;/span&gt;부터 &lt;span style=&quot;color: #333333;&quot;&gt;로그파일명_1439.&lt;span style=&quot;color: #333333;&quot;&gt;txt &lt;/span&gt;까지 생기게 되죠.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;잠시 fluentd가 로그파일을 중복되지 않고 전송하는 흐름을 살펴보면&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;S3에 로&lt;span style=&quot;color: #333333;&quot;&gt;그파일명_0.&lt;span style=&quot;color: #333333;&quot;&gt;txt &lt;/span&gt;이 있다고 가정하에&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;서버상에서 로그파일명.log 를 S3로 Put&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;span style=&quot;color: #333333;&quot;&gt;로&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그파일명_0.&lt;span style=&quot;color: #333333;&quot;&gt;txt 로 Get Request 전송&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;에러가 발생하지 않으므로 S3에 존재한다고 판단하여 &lt;span style=&quot;color: #333333;&quot;&gt;로&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그파일명_1.&lt;span style=&quot;color: #333333;&quot;&gt;txt로 Get Request 전송&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;에러 ( &quot;errorCode&quot;: &quot;NoSuchKey&quot;&lt;span style=&quot;color: #333333;&quot;&gt;）&lt;/span&gt;가 발생하므로 S3에 없다고 판단하여 &lt;span style=&quot;color: #333333;&quot;&gt;로&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그파일명_1.&lt;span style=&quot;color: #333333;&quot;&gt;txt로 Put Request&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;입니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러므로 제 경우에는 로그파일 하나당 24시간동안 보내는 Get Request가 1+2+3+~~~+1439 = 1,036,080 가 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이걸 비용으로 계산하면&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;0.00035 USD ( 1000 Request당 ) &lt;/span&gt;X 1,091.08 (&lt;span style=&quot;color: #333333;&quot;&gt;1,036,080을1000로 나눈값 &lt;/span&gt;) = 0.381878 USD&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;로그파일 1개당 1일 &lt;span style=&quot;color: #333333;&quot;&gt;0.381878 USD&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;월로 따지면 11.45634 USD ( 30일 기준 )&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;전송해야 하는 로그파일이 10개만 되어도 115 USD&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-filename=&quot;Amazon-S3-Simple-Storage-Service-요금-Amazon-Web-Services.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;384&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYQZuu/btqFY0sihiW/J90V8P1WNMI0Weixj1WOD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYQZuu/btqFY0sihiW/J90V8P1WNMI0Weixj1WOD0/img.png&quot; data-alt=&quot;S3 Get Request비용(서울리전)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYQZuu/btqFY0sihiW/J90V8P1WNMI0Weixj1WOD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYQZuu%2FbtqFY0sihiW%2FJ90V8P1WNMI0Weixj1WOD0%2Fimg.png&quot; data-filename=&quot;Amazon-S3-Simple-Storage-Service-요금-Amazon-Web-Services.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;384&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;S3 Get Request비용(서울리전)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;저는 날짜별로 폴더를 나누어서 저장했어도 월 500 USD 정도 Get Request비용을 지불했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;S3에 저장되는 로그파일을 index번호로 하지 않고 타임스탬프로 하면 중복될 이유가 없으므로 다음과 같이 변경했습니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1595492519742&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;check_object false
s3_object_key_format 에서&amp;nbsp;%{hms_slice}를 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;여기서 &lt;span style=&quot;color: #333333;&quot;&gt;%{&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;hms_slice}&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;를 사용하면 오후 2시10분46초인 경우에 031046으로 생성되게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJoZWFkaW5nLTIlMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMnRpbWVfc2xpY2VfZm9ybWF0JTIyJTJDJTIybWFya3MlMjIlM0ElNUIlNUQlN0QlNUQlN0QlNUQlN0QlNUQlN0Q=&quot;&gt;time_slice_format은 utc를 true로 지정하지&lt;/span&gt; 않는 이상 Local timezone을 사용하게끔 되어 있습니다만, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;%{&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;hms_slice}는 &lt;span style=&quot;color: #333333;&quot;&gt;03:10:46&lt;/span&gt;&lt;/span&gt;T09:00형식으로 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 저장된 시간과 파일명이 다르므로 약간 보기 어려워서 다음과 같이 설정하면 Local timezone형식으로 파일명에 사용할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;s3_object_key_format 에서&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;%H%M%S &lt;span style=&quot;color: #333333;&quot;&gt;를 사용&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이거 찾느라고 엄청 구글링해보았는데 아무도 사용하지 않아서 try &amp;amp; run 했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>fluentd</category>
      <category>fluentd #S3 #GetRequest #비용절약</category>
      <author>iolle</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/6</guid>
      <comments>https://cloudpark-iolle.tistory.com/6#entry6comment</comments>
      <pubDate>Thu, 23 Jul 2020 17:27:07 +0900</pubDate>
    </item>
    <item>
      <title>fluentd을 이용하여 s3로 로그전송시 전송지연 발생</title>
      <link>https://cloudpark-iolle.tistory.com/5</link>
      <description>&lt;p&gt;fluentd가 flush하는 구조를 보면 다음 그림과 같이 &lt;span style=&quot;color: #333333;&quot;&gt;buffer file에 tag값과 time 키값으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;chunk가&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;쌓이게 되고 flush_interval 에 설정된 시간이 지나거나 buffer_chunk_limit가 초과하게 되면 enqueue가 발생하게 됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;buffer-internal-and-parameters.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XBBM7/btqEa1gLc4N/TjH8cXuktKNsROiIUYdoRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XBBM7/btqEa1gLc4N/TjH8cXuktKNsROiIUYdoRK/img.png&quot; data-alt=&quot;fluentd output flush 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XBBM7/btqEa1gLc4N/TjH8cXuktKNsROiIUYdoRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXBBM7%2FbtqEa1gLc4N%2FTjH8cXuktKNsROiIUYdoRK%2Fimg.png&quot; data-filename=&quot;buffer-internal-and-parameters.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fluentd output flush 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;buffer chunk가 flush되는 조건은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;buffer chunk가 flush되는 조건&lt;/h3&gt;
&lt;p&gt;flush_interval&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정값에 의하여 조건이 바뀌게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;flush_interval를 설정하였을 때의 조건&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;buffer chunk 사이즈가&lt;span&gt;&amp;nbsp;&lt;/span&gt;chunk_limit_size * chunk_full_threshold&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에 도달했을 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;buffer chunk가 생성되고 나서&lt;span&gt;&amp;nbsp;&lt;/span&gt;flush_interval에 지정된 시간이 경과하였을 경우 (chunk_limit_size * chunk_full_threshold&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에 도달하지 않은 경우에도 이 시간이 경과하면 강제적으로 flush됩니다)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;flush_interval를 설정하지 않았을 때의 조건&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;buffer chunk사이즈가&lt;span&gt;&amp;nbsp;&lt;/span&gt;chunk_limit_size * chunk_full_threshold에 도달한 경우&lt;/li&gt;
&lt;li&gt;timekey로 지정된 시간폭&amp;nbsp;+&lt;span&gt;&amp;nbsp;&lt;/span&gt;timekey_wait&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 지정된 시간을 경과한 경우&lt;/span&gt;
&lt;ul&gt;
&lt;li&gt;다음과 같은 값이 설정되었다고 한다면 매시 9분 59초 ( 매시 59분 9초 + 10분 )에 flush 됩니다.
&lt;ul&gt;
&lt;li&gt;timekey: 1h&lt;/li&gt;
&lt;li&gt;timekey_wait: 10m&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;fluentd(V 1.10.0)을 이용하여 애플리케이션 로그를 S3에 전송하도록 하였습니다.&lt;/p&gt;
&lt;p&gt;td-agent.conf에서 flush간격을 flush_interval 을 60초로 설정하였습니다.&lt;/p&gt;
&lt;p&gt;설정내용은 다음과 같이 했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1589522933748&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;buffer tag,time&amp;gt;
    @type file
    path /var/log/td-agent/buffer/app
    flush_mode interval
    flush_interval 60s
    flush_at_shutdown true
&amp;lt;/buffer&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;운영을 하다보니 다음과 같은 warning 메세지(&lt;span style=&quot;color: #333333;&quot;&gt;flush하는데에 시간이 초과되었습니다)&lt;/span&gt;가 기록되면서 s3에 전송되는 로그파일이 최대 12시간 정도후에 전송되는 일이 발생했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1589536364165&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2020-05-07 21:31:22 +0900 [warn]: #0 buffer flush took longer time than slow_flush_log_threshold: elapsed_time=21.624852824024856 slow_flush_log_threshold=20.0 plugin_id=&quot;object:3fde83f49f4c&quot; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 buffer의 output type를 file로 설정하여서 /var/log/td-agent/buffer/app/ 밑에 buffer file이 생성되는데&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;buffer.b******************* 파일만 생성이 되고 60초가 지나도 buffer.q******************* 파일이 제대로 생성되지 않은 것을 알게 되었습니다. &lt;span style=&quot;color: #333333;&quot;&gt;buffer.b******************* 파일이 2만개 정도 쌓이게 되었고 queue파일이 드문드문 생성되어 S3에 전송된다는 사실을 알게 되었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;queue파일이 제대로 생성되지 않는 다는 원인에 기인하여 flush가 제대로 되고 있지 않는 것이었습니다. 그래서 공식document &lt;a href=&quot;https://docs.fluentd.org/configuration/buffer-section&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.fluentd.org/configuration/buffer-section&lt;/a&gt;를 찾아보게 되고 &lt;span&gt;flush_thread_count가 default 한 개인 것을 알게 되어 flush thread를 좀 많게 하면 어떨까 하고 검증하게 되었습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;flush_thread_count 설정값과 연동하여 &lt;span&gt;queued_chunks_limit_size값이 셋팅되기 때문에 다른 값을 설정하려면 &lt;span&gt;queued_chunks_limit_size&lt;/span&gt;도 설정해야 될 필요가 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1589539293596&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;・queued_chunks_limit_size [integer] (since v1.1.3)
    Default: 1 (equals to the same value as the flush_thread_count parameter)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 td-agent.conf 다음과 같이 &lt;span&gt;flush_thread_count를 4로 &lt;/span&gt;설정하여 테스트해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1589539553195&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;buffer tag,time&amp;gt;
    @type file
    path /var/log/td-agent/buffer/app
    flush_mode interval
    flush_interval 60s
    flush_at_shutdown true
    flush_thread_count 4
&amp;lt;/buffer&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;td-agent restart할 때엔 다음과 같이 하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1589539634006&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo service td-agent reload&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;reload함과 동시에 &lt;span style=&quot;color: #333333;&quot;&gt;buffer.b******************* 파일&lt;/span&gt;이 &lt;span style=&quot;color: #333333;&quot;&gt;buffer.q******************* 파일로 바뀌게 되고 &lt;/span&gt;2만개 정도의 &lt;span style=&quot;color: #333333;&quot;&gt;buffer.q******************* 파일이 서서히 s3로 output되는 것을 볼 수가 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파일 변경 모니터링을 할 때에 watch command를 사용하면 모니터링을 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1589539857951&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;watch -n 5 -d ls -l&lt;/code&gt;&lt;/pre&gt;</description>
      <category>fluentd</category>
      <author>iolle</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/5</guid>
      <comments>https://cloudpark-iolle.tistory.com/5#entry5comment</comments>
      <pubDate>Thu, 14 May 2020 20:18:53 +0900</pubDate>
    </item>
    <item>
      <title>aws spot instance 서버로그 관리(feat. fluentd)</title>
      <link>https://cloudpark-iolle.tistory.com/4</link>
      <description>&lt;p&gt;Spot인스턴스를 사용하면 인스턴스 요금을 최대한 줄일 수 있습니다만 spot인스턴스 사용할 수 있는 용량이 적어지거나 설정한 요금보다 비싸지게 되면 spot인스턴스가 Stop되거나 terminate되는 경우가 있습니다.&lt;/p&gt;
&lt;p&gt;terminate될 경우에 spot인스턴스내에 있던 로그를 영영 복구할 수 없게 되죠.&lt;/p&gt;
&lt;p&gt;그래서 로그를 어떻게 하면 실시간으로 한곳에 모으거나 spot인스턴스가 terminate되는 신호를 trigger하여 로그를 Flush할 수 없을까하는 방법을 찾던 중에 fluentd를 찾게 되었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;fluentd란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 fluentd는 무엇일까&lt;/p&gt;
&lt;p&gt;간단히 얘기하자면 fluentd는 로그를 수집하는 도구입니다. 그리고 Opensource입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.fluentd.org/&quot;&gt;https://www.fluentd.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1587988951251&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Fluentd | Open Source Data Collector&quot; data-og-description=&quot;&amp;quot;Logs are streams, not files. I love that Fluentd puts this concept front-and-center, with a developer-friendly approach for distributed systems logging.&amp;quot; Adam Wiggins, Heroku co-founder&quot; data-og-host=&quot;www.fluentd.org&quot; data-og-source-url=&quot;https://www.fluentd.org/&quot; data-og-url=&quot;https://www.fluentd.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdqJ1e/hyFPBFqKeD/Daxf0lfACcHeHuhle0etJ0/img.png?width=801&amp;amp;height=242&amp;amp;face=0_0_801_242&quot;&gt;&lt;a href=&quot;https://www.fluentd.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.fluentd.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdqJ1e/hyFPBFqKeD/Daxf0lfACcHeHuhle0etJ0/img.png?width=801&amp;amp;height=242&amp;amp;face=0_0_801_242');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Fluentd | Open Source Data Collector&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&quot;Logs are streams, not files. I love that Fluentd puts this concept front-and-center, with a developer-friendly approach for distributed systems logging.&quot; Adam Wiggins, Heroku co-founder&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.fluentd.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;fluentd(td-agent)를 사용하면 로그를 한곳으로 수집할 수 있고 또는 S3 bucket에 실시간으로 로그를 전송할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;현재 SRE팀으로 시스템 운영을 하는 회사에서는 기존 시스템 로그, 애플리케이션 로그를 S3 bucket으로 S3 Sync를 이용하여 전송하고 있는데 cron설정으로 1시간마다 S3 sync하고 있어서 Spot인스턴스가 terminate하여 로그가 복구가 안되는 경우가 항상 있었습니다. 또한 S3 sync의 단점으로 뽑자면 로그파일의 용량이 어마무지하게 커지면 S3 Sync로 전송하는 경우에 리소스를 엄청 잡아 먹게 되어 서버에 부하를 주게 됩니다. 로그를 수집하려고 웹서비스에 영향을 주는 것은 잘못된 설계라고 할 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 Sync CLI&lt;/p&gt;
&lt;pre id=&quot;code_1587989515510&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws s3 sync ${APPLOGPATH} s3://${BUCKET_NAME/${APP_NAME}/${APP_ENV}/${year}/${month}/${day}/ --exclude &quot;*&quot; --include &quot;${ymd}_*.log&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;fluentd구성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그래서 fluentd로 할 수 있는 방법으로 재설계하게 되었습니다.&lt;/p&gt;
&lt;p&gt;다음과 같이 간단하게 설계했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;fluent_system.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S19q5/btqDIRezIcH/gA6Bh7J3ro2u3JKAXOmX51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S19q5/btqDIRezIcH/gA6Bh7J3ro2u3JKAXOmX51/img.png&quot; data-alt=&quot;fluentd on Autosaling group&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S19q5/btqDIRezIcH/gA6Bh7J3ro2u3JKAXOmX51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS19q5%2FbtqDIRezIcH%2FgA6Bh7J3ro2u3JKAXOmX51%2Fimg.png&quot; data-filename=&quot;fluent_system.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;591&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fluentd on Autosaling group&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;autoscaling group을 ondemand와 spot으로 구성하여 Scale Out 또는 Scale In 시에는 Spot인스턴스만 늘어나고 줄어 들게끔 구성하였습니다.&lt;/p&gt;
&lt;p&gt;1. 통상적으로 운영시에는 로그파일의 용량이 커짐에 따라 수집할 데이터가 많아지므로 fluentd의 설정을 60초마다 tail방식으로 로그를 S3에 전송하도록 했습니다.&lt;/p&gt;
&lt;p&gt;2. Scale In하게 되어 인스턴스가 줄어들게 되거나 spot인스턴스의 가용 용량이 적어지게 되거나 설정한 요금보다 높아지게 되면 spot인스턴스가 자동적으로 terminate하게 될 경우에는 Buffer상에 쌓아둔 로그를 자동적으로 flush하도록 스크립트를 작성하였습니다. Spot&lt;span style=&quot;color: #333333;&quot;&gt;인스턴스는 중단되기 2분전에 중단 이벤트가 발생하므로 중단 이벤트를 트리거로 스크립트가 실행되게끔 설정하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;spot 인스턴스 중단 이벤트는 termination-time 메타데이터를 활용하는 것이 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587991421493&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TOKEN=`curl -X PUT &quot;http://169.254.169.254/latest/api/token&quot; -H &quot;X-aws-ec2-metadata-token-ttl-seconds: 21600&quot;`
if curl -H &quot;X-aws-ec2-metadata-token: $TOKEN&quot; -s http://169.254.169.254/latest/meta-data/spot/termination-time | grep -q .*T.*Z; then echo terminated; fi&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;참고 : &lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/spot-interruptions.html&quot;&gt;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/spot-interruptions.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1587991446954&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;스팟 인스턴스 중단 - Amazon Elastic Compute Cloud&quot; data-og-description=&quot;스팟 인스턴스 중단 스팟 인스턴스에 대한 수요는 매 순간 상당히 다를 수 있으며 스팟 인스턴스의 가용성도 사용 가능한 미사용 EC2 인스턴스의 양에 따라 상당히 달라질 수 있습니다. 스팟 인스턴스가 중단될 가능성은 항상 있습니다. 따라서 스팟 인스턴스 중단에 대비하여 애플리케이션을 준비해야 합니다. EC2 집합 또는 스팟 집합에 지정된 온디맨드 인스턴스는 중단할 수 없습니다. 중단 이유 Amazon EC2에서 스팟 인스턴스를 중단시킬 수 있는 이유는 다음&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/spot-interruptions.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/spot-interruptions.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/spot-interruptions.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/spot-interruptions.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;스팟 인스턴스 중단 - Amazon Elastic Compute Cloud&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;스팟 인스턴스 중단 스팟 인스턴스에 대한 수요는 매 순간 상당히 다를 수 있으며 스팟 인스턴스의 가용성도 사용 가능한 미사용 EC2 인스턴스의 양에 따라 상당히 달라질 수 있습니다. 스팟 인스턴스가 중단될 가능성은 항상 있습니다. 따라서 스팟 인스턴스 중단에 대비하여 애플리케이션을 준비해야 합니다. EC2 집합 또는 스팟 집합에 지정된 온디맨드 인스턴스는 중단할 수 없습니다. 중단 이유 Amazon EC2에서 스팟 인스턴스를 중단시킬 수 있는 이유는 다음&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;중단 이벤트뿐만 아니라 Spot인스턴스가 정지될 경우를 대비하여 buffer flush 스크립트를 daemon으로 설정할 필요가 있습니다. 자세한 내용을 제일 아래에 쓰도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Fluentd인스톨&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AmazonLinux (CentOS6)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587991741058&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AmazonLinux2 &lt;span style=&quot;color: #333333;&quot;&gt;(CentOS7)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587991762992&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Amazon Linux 2
$ curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;※fluentd공식document : &lt;a href=&quot;https://docs.fluentd.org/installation/install-by-rpm&quot;&gt;https://docs.fluentd.org/installation/install-by-rpm&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1587991814130&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Install by RPM Package (Redhat Linux)&quot; data-og-description=&quot; &quot; data-og-host=&quot;docs.fluentd.org&quot; data-og-source-url=&quot;https://docs.fluentd.org/installation/install-by-rpm&quot; data-og-url=&quot;https://docs.fluentd.org/installation/install-by-rpm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zNtK2/hyFPzVfEwW/jvc4UrB57BH05xXAnFaCVK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.fluentd.org/installation/install-by-rpm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.fluentd.org/installation/install-by-rpm&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zNtK2/hyFPzVfEwW/jvc4UrB57BH05xXAnFaCVK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Install by RPM Package (Redhat Linux)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.fluentd.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;td-agent.conf 설정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1587992175735&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;source&amp;gt;
  @type tail
  format /^(?&amp;lt;body&amp;gt;.*)$/
  path /var/log/httpd/*access_log,/var/log/httpd/*error_log
  pos_file /var/tmp/fluentd.tail_httpd.pos
  tag tail.httpd.*
  refresh_interval 60
  read_from_head true
&amp;lt;/source&amp;gt;

&amp;lt;source&amp;gt;
  @type tail
  format /^(?&amp;lt;body&amp;gt;.*)$/
  path /var/log/messages,/var/log/secure
  pos_file /var/tmp/fluentd.tail_sys.pos
  tag tail.sys.*
  refresh_interval 60
  read_from_head true
&amp;lt;/source&amp;gt;

&amp;lt;source&amp;gt;
  @type tail
  format /^(?&amp;lt;body&amp;gt;.*)$/
  path /usr/app/logs/%Y%m%d_*debug.log,/usr/app/logs/%Y%m%d_*error.log
  pos_file /var/tmp/fluentd.tail_app.pos
  tag tail.app.*
  refresh_interval 60
  read_from_head true
&amp;lt;/source&amp;gt;

## httpd logs
&amp;lt;match tail.httpd.**&amp;gt;
  @type s3
  s3_region ap-northeast-2
  s3_bucket system-logs
  path httpd/${tag[5]}/
  time_slice_format %Y/%m/%d
  store_as text
  s3_object_key_format &quot;%{path}%{time_slice}/${tag[5]}.#{Socket.gethostname}.%{index}.%{file_extension}&quot;
  &amp;lt;buffer tag,time&amp;gt;
    @type file
    path /var/log/td-agent/buffer/httpd
    timekey 60
    timekey_wait 0
    flush_mode interval
    flush_interval 60s
    flush_at_shutdown true
  &amp;lt;/buffer&amp;gt;
&amp;lt;/match&amp;gt;

## sys logs
&amp;lt;match tail.sys.**&amp;gt;
  @type s3
  s3_region ap-northeast-2
  s3_bucket system-logs
  path syslog/${tag[4]}/
  time_slice_format %Y/%m/%d
  store_as text
  s3_object_key_format &quot;%{path}%{time_slice}/${tag[4]}.#{Socket.gethostname}.%{index}.%{file_extension}&quot;
  &amp;lt;buffer tag,time&amp;gt;
    @type file
    path /var/log/td-agent/buffer/syslog
    timekey 60
    timekey_wait 0
    flush_mode interval
    flush_interval 60s
    flush_at_shutdown true
  &amp;lt;/buffer&amp;gt;
&amp;lt;/match&amp;gt;

## application logs
&amp;lt;match tail.app.usr.app.**&amp;gt;
  @type s3
  s3_region ap-northeast-2
  s3_bucket app-logs
  path app/${tag[4]}/
  time_slice_format %Y/%m/%d
  store_as text
  s3_object_key_format &quot;%{path}%{time_slice}/${tag[10]}.#{Socket.gethostname}.%{index}.%{file_extension}&quot;
  &amp;lt;buffer tag,time&amp;gt;
    @type file
    path /var/log/td-agent/buffer/application
    timekey 60
    timekey_wait 0
    flush_mode interval
    flush_interval 60s
    flush_at_shutdown true
  &amp;lt;/buffer&amp;gt;
&amp;lt;/match&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;※td-agent.conf관련 설정 공식 document&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.fluentd.org/configuration&quot;&gt;https://docs.fluentd.org/configuration&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1587992260678&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Configuration&quot; data-og-description=&quot; &quot; data-og-host=&quot;docs.fluentd.org&quot; data-og-source-url=&quot;https://docs.fluentd.org/configuration&quot; data-og-url=&quot;https://docs.fluentd.org/configuration&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blv5hk/hyFPLOTXxG/HvJLbC4Ck5F84XPRLizphK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.fluentd.org/configuration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.fluentd.org/configuration&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blv5hk/hyFPLOTXxG/HvJLbC4Ck5F84XPRLizphK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Configuration&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.fluentd.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;td-agent start&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;AmazonLinux (CentOS6)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588920131449&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# td-agent daemon start
$ sudo /etc/init.d/td-agent start

# td-agent daemon 확인
$ sudo /etc/init.d/td-agent status

# td-agent stop
$ sudo /etc/init.d/td-agent stop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;AmazonLinux2&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(CentOS7)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588920159033&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# td-agent daemon start
$ sudo systemctl start td-agent.service

# td-agent daemon 확인
$ sudo systemctl status td-agent.service

# td-agent daemon stop
$ sudo systemctl stop td-agent.service
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;buffer flush 스크립트 daemon설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;daemon name : fluentd_bufferflush_daemon&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587992744851&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
#
# Version: 0.1
#
# chkconfig: 2345 99 01
# description: fluentd_bufferflush_daemon shell
# processname: fluentd_bufferflush_daemon

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# Source function library.
. /etc/init.d/functions

lock_file=&quot;/var/lock/subsys/fluentd_bufferflush_daemon&quot;

start() {
        touch $lock_file
        #spot instance buffer flush scripts execute
        /bin/sh /home/ec2-user/fluentd_tool/spot_fluentd_buffer_flush.sh &amp;gt;&amp;gt; /var/log/td-agent/buffer_flush.log &amp;amp;
}

stop() {
        rm -f $lock_file
        /bin/sh /home/ec2-user/fluentd_tool/fluentd_buffer_flush.sh &amp;gt;&amp;gt; /var/log/td-agent/buffer_flush.log
}

restart() {
        stop
        start
}


case &quot;$1&quot; in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                restart
                ;;
        *)
                echo &quot;Usage: $0 {start|stop|restart}&quot;
                exit 1
esac
exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;service daemon에 등록 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Amazon linux (centos6)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588919537022&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# service daemon 등록
cd ~/{daemon directory}/
sudo cp -r fluentd_bufferflush_daemon /etc/init.d/
cd /etc/init.d/
sudo chmod 755 fluentd_bufferflush_daemon

# service daemon 실행/정지
service fluentd_bufferflush_daemon start
service fluentd_bufferflush_daemon stop

# 실행 정지에 문제가 없으면 인스턴스 기동시에는 가장 늦게(99) 실행되도록 인스턴스 정지시에는 가장 먼저(01) 실행되도록 등록
# chkconfig: 2345 99 01
chkconfig --add fluentd_bufferflush_daemon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Amazon linux2 (centos7)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588921056865&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# service daemon 등록
cd ~/{daemon directory}/
sudo cp -r fluentd_bufferflush_daemon /usr/lib/systemd/system/
cd /usr/lib/systemd/system/
sudo chmod 755 fluentd_bufferflush_daemon

# service daemon 실행/정지
sudo systemctl start fluentd_bufferflush_daemon
sudo systemctl stop fluentd_bufferflush_daemon

# 실행 정지에 문제가 없으면 인스턴스 기동시에는 가장 늦게(99) 실행되도록 인스턴스 정지시에는 가장 먼저(01) 실행되도록 등록
# chkconfig: 2345 99 01
systemctl enable fluentd_bufferflush_daemon&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Buffer flush실행 스크립트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;fluentd_buffer_flush.sh&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587992942315&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

now=$(date +&quot;%Y-%m-%d %T&quot;)
echo &quot;[INFO] START fluentd buffer flush : $now&quot;

# run/pid의 프로세스No로 동작하는지를 확인
TD_PID_FILE=/var/run/td-agent/td-agent.pid
TD_PID=$(cat ${TD_PID_FILE})
echo &quot;[INFO] td-agent pid : $TD_PID&quot;

# fluentd (or td-agent) 프로세스가 SIGUSR1 를 수신하게 되면
# 강제적으로 buffer에 담아두었던 메세지(chunk)가 flush되도록 되어 있음
sudo kill -SIGUSR1 $TD_PID

now=$(date +&quot;%Y-%m-%d %T&quot;)
echo &quot;[INFO] END fluentd buffer flush : $now&quot;
exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;spot_fluentd_buffer_flush.sh&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587992993162&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
now=$(date +&quot;%Y-%m-%d %T&quot;)
echo &quot;[INFO] START Spot fluentd buffer flush : $now&quot;
instanceId=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

echo &quot;[INFO] instanceId: $instanceId&quot;
echo &quot;[INFO] termination_time: $(curl -s http://169.254.169.254/latest/meta-data/spot/termination-time)&quot;
while :
do
  if curl -s http://169.254.169.254/latest/meta-data/spot/termination-time | grep -q .*T.*Z; then
   /bin/sh /home/ec2-user/fluentd_tool/fluentd_buffer_flush.sh
   now=$(date +&quot;%Y-%m-%d %T&quot;)
   echo &quot;[INFO] STOP Spot fluentd buffer flush : $now&quot;
   break
  fi
  sleep 5
done
exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인스톨 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Amazonlinux (centos6)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588919247404&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo service td-agent status
grep &quot;TD_AGENT_USER=&quot; /etc/init.d/td-agent
grep &quot;TD_AGENT_GROUP=&quot; /etc/init.d/td-agent
ps -ef | grep td-agent #root로 되어 있는지 확인
grep &quot;following tail of&quot; /var/log/td-agent/td-agent.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Amazonlinux (centos7)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588921843902&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status td-agent.service
grep &quot;TD_AGENT_USER=&quot; /etc/init.d/td-agent
grep &quot;TD_AGENT_GROUP=&quot; /etc/init.d/td-agent
ps -ef | grep td-agent #root로 되어 있는지 확인
grep &quot;following tail of&quot; /var/log/td-agent/td-agent.log&lt;/code&gt;&lt;/pre&gt;</description>
      <category>fluentd</category>
      <author>iolle</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/4</guid>
      <comments>https://cloudpark-iolle.tistory.com/4#entry4comment</comments>
      <pubDate>Mon, 27 Apr 2020 22:13:27 +0900</pubDate>
    </item>
    <item>
      <title>Datadog APM인스톨 (ruby on rails)</title>
      <link>https://cloudpark-iolle.tistory.com/3</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ruby dd-trace 인스톨&lt;/span&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;datadog agent 인스톨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;datadog.yaml파일 수정&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;datadog-agent restart&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ddtrace gem file 인스톨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;intializers file 만들기&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;unicorn restart&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;※amazonlinux1에서 인스톨했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;※현재 대응하고 있는 ruby와 unicorn 버전은 다음에서 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://docs.datadoghq.com/ja/tracing/setup/ruby/#compatibility&quot;&gt;https://docs.datadoghq.com/ja/tracing/setup/ruby/#compatibility&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1587714707961&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Tracing Ruby Applications&quot; data-og-description=&quot;Datadogが大規模なクラウドのモニタリングサービスをリードします。&quot; data-og-host=&quot;docs.datadoghq.com&quot; data-og-source-url=&quot;https://docs.datadoghq.com/ja/tracing/setup/ruby/#compatibility&quot; data-og-url=&quot;https://docs.datadoghq.com/ja/tracing/setup/ruby/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/A9BQ4/hyFNWIqR3Q/qSIcKm6NSAVNCCmectiM4K/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500&quot;&gt;&lt;a href=&quot;https://docs.datadoghq.com/ja/tracing/setup/ruby/#compatibility&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.datadoghq.com/ja/tracing/setup/ruby/#compatibility&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/A9BQ4/hyFNWIqR3Q/qSIcKm6NSAVNCCmectiM4K/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Tracing Ruby Applications&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Datadogが大規模なクラウドのモニタリングサービスをリードします。&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.datadoghq.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;datadog agent 인스톨&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1587714738339&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# root 유저 
$ sudo su 

# datadog agent install
$ DD_API_KEY={datadog api key} bash -c &quot;$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)&quot; 

#인스톨 확인
$ ps aux | grep agent | grep datadog &lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;datadog.yaml파일 수정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음 내용 추가&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587714808128&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo view /etc/datadog-agent/datadog.yaml 
#############################
api_key: XXXXXXXXXXXXXXXXXXXXXXX # datadog agent api key
collect_ec2_tags: true           # ec2 tag 수집
process_config:                  # 호스트의 CPU, 메모리, I/O, thread수 등 프로세스의 metric 수집
 enabled: true 
apm_config:                      # apm관련 설정
 enabled: true                   # apm 수집 on
#############################&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;다른 플랫폼으로부터 trace data를 수신하는 경우에는&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587714820316&quot; class=&quot;html xml&quot; style=&quot;overflow: auto; background: rgba(0, 0, 0, 0.05); font-size: 16px; color: rgba(34, 85, 51, 0.87); white-space: pre-wrap; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apm_non_local_traffic: true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;datadog-agent restart&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;datadog agent를 restart시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1587714834939&quot; class=&quot;html xml&quot; style=&quot;overflow: auto; background: rgba(0, 0, 0, 0.05); font-size: 16px; color: rgba(34, 85, 51, 0.87); white-space: pre-wrap; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo stop datadog-agent
$ sudo start datadog-agent 
$ ps -ef | grep datadog-agent&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ddtrace gem file 인스톨&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Gemfile에 ddtrace 추가&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587714955812&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;view {repository deploy path}/Gemfile 
################################################## 
gem 'ddtrace' 
##################################################&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;bundle install&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;※Gemfile.lock가 변경되지 않아 다음과 같이 option( --no-deployment)으로 실행&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587715059649&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bundle install --no-deployment&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;initializer file作成&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;{repository deploy path}/config/initalizers/에 &lt;span style=&quot;color: #333333;&quot;&gt;datadog-tracer.rb 파일 작성&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587715253589&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi {repository deploy path}/config/initializers/datadog-tracer.rb 
################################################### 
require 'ddtrace' 
Datadog.configure do |c| 
 c.use :rails, service_name: 'my app service name' 
end 
###################################################&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;tag env나 tag role로 설정해둔 환경변수로 service_name를 변경할 경우에는 다음과 같이 함&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만약 capistrano로 deploy할 경우에는 환경변수는 /etc/enviroment에 환경변수로 설정해야지 deploy할 때에 변수를 넘길 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587715546865&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export DD_SERVICE_NAME={Tag env}-{Tag role}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;환경변수 값을 &lt;span style=&quot;color: #333333;&quot;&gt;datadog-tracer.rb 파일에서 사용할려고 할때에는 다음과 같이 바꾸어 준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587715638461&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi {repository deploy path}/config/initializers/datadog-tracer.rb 
################################################### 
require 'ddtrace' 
Datadog.configure do |c| 
 c.use :rails, service_name: &quot;#{ENV['DD_SERVICE_NAME']}&quot; 
end 
###################################################&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;unicorn restart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;</description>
      <category>datadog</category>
      <author>iolle</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/3</guid>
      <comments>https://cloudpark-iolle.tistory.com/3#entry3comment</comments>
      <pubDate>Fri, 24 Apr 2020 17:23:06 +0900</pubDate>
    </item>
    <item>
      <title>Datadog APM 인스톨(php)</title>
      <link>https://cloudpark-iolle.tistory.com/2</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;php dd-trace 인스톨&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;datadog agent 인스톨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;datadog.yaml파일 수정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;datadog-agent restart&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Install the PHP extension&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;php restart&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;※amazonlinux1에서 인스톨했습니다.&lt;/p&gt;
&lt;p&gt;※현재 대응하고 있는 php 버전은 다음에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.datadoghq.com/ja/tracing/setup/php/#compatibility&quot;&gt;https://docs.datadoghq.com/ja/tracing/setup/php/#compatibility&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1587518231136&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Tracing PHP Applications&quot; data-og-description=&quot;Datadogが大規模なクラウドのモニタリングサービスをリードします。&quot; data-og-host=&quot;docs.datadoghq.com&quot; data-og-source-url=&quot;https://docs.datadoghq.com/ja/tracing/setup/php/#compatibility&quot; data-og-url=&quot;https://docs.datadoghq.com/ja/tracing/setup/php/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvT2UZ/hyFLHSJ8fn/Shag2KkyBfPLorPvEq9GY1/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500&quot;&gt;&lt;a href=&quot;https://docs.datadoghq.com/ja/tracing/setup/php/#compatibility&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.datadoghq.com/ja/tracing/setup/php/#compatibility&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvT2UZ/hyFLHSJ8fn/Shag2KkyBfPLorPvEq9GY1/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Tracing PHP Applications&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Datadogが大規模なクラウドのモニタリングサービスをリードします。&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.datadoghq.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;datadog agent 인스톨&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587518465492&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# root 유저 
$ sudo su 

# datadog agent install
$ DD_API_KEY={datadog api key} bash -c &quot;$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)&quot; 

#인스톨 확인
$ ps aux | grep agent | grep datadog &lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;datadog.yaml파일 수정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음 내용 추가&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587123705375&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo view /etc/datadog-agent/datadog.yaml&amp;nbsp;
#############################
api_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # datadog agent api key
collect_ec2_tags: true                    # ec2 tag 수집
process_config: &amp;nbsp;                         # 호스트의 CPU, 메모리, I/O, thread수 등 프로세스의 metric 수집
 enabled: true 
apm_config: &amp;nbsp;                             # apm관련 설정
 enabled: true &amp;nbsp;                          # apm 수집 on
#############################&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다른 플랫폼으로부터 trace data를 수신하는 경우에는 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587124663601&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apm_non_local_traffic: true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;을 추가합니다.&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;b&gt;datadog-agent restart&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;datadog agent를 restart시킵니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1587123788101&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo stop datadog-agent
$ sudo start datadog-agent 
$ ps -ef | grep datadog-agent&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;Install the PHP extension&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;datadog의 git repository에서 &lt;a href=&quot;datadog-php-tracer-0.41.1-1.x86_64.rpm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;datadog-php-tracer-0.41.1-1.x86_64.rpm&lt;/a&gt;를 다운받아 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1587123858361&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd /usr/local/src 
$ sudo curl -OL https://github.com/DataDog/dd-trace-php/releases/download/0.41.1/datadog-php-tracer-0.41.1-1.x86_64.rpm 
$ sudo rpm -ivh datadog-php-tracer-0.41.1-1.x86_64.rpm&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;service name설정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;apache를 사용하고 있다면 httpd.conf의 virtual host에서 SetEnv DD_SERVICE_NAME 을 이용하여 설정할 수 있습니다..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1587125292238&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SetEnv DD_SERVICE_NAME 서비스명&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;php restart&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1587123890605&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo service httpd restart&lt;/code&gt;&lt;/pre&gt;</description>
      <category>datadog</category>
      <author>iolle</author>
      <guid isPermaLink="true">https://cloudpark-iolle.tistory.com/2</guid>
      <comments>https://cloudpark-iolle.tistory.com/2#entry2comment</comments>
      <pubDate>Tue, 24 Mar 2020 22:17:08 +0900</pubDate>
    </item>
  </channel>
</rss>