<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>CloudWatch Logs on Chanyeol Dev</title>
    <link>https://chanyeols.com/tags/cloudwatch-logs/</link>
    <description>Recent content in CloudWatch Logs on Chanyeol Dev</description>
    <generator>Hugo</generator>
    <language>ko-kr</language>
    <lastBuildDate>Tue, 21 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://chanyeols.com/tags/cloudwatch-logs/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>CodePipeline 실패 해결법: CI/CD 파이프라인 문제 분석부터 복구까지</title>
      <link>https://chanyeols.com/posts/aws-codepipeline-error-handling-guide/</link>
      <pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://chanyeols.com/posts/aws-codepipeline-error-handling-guide/</guid>
      <description>aws-codepipeline-error-handling-guide-for-ci-cd-pipeline-failure-analysis-and-solutions</description>
      <content:encoded><![CDATA[<h2 id="aws-codepipeline-실패-해결법-cicd-파이프라인-문제-분석부터-복구까지">AWS CodePipeline 실패 해결법: CI/CD 파이프라인 문제 분석부터 복구까지</h2>
<p><img alt="CodePipeline 실패 해결법: CI/CD 파이프라인 문제 분석부터 복구까지" loading="lazy" src="https://pixabay.com/get/gfb2bb5ab925ed6495973d8f9b1c5b98d884d4231bce43ede872c59ce3175521019502b8e5f35658a3bcb10094ae807a4d6faa79c01c99a5a53dbf1a08b4eb39f_1280.png"></p>
<p>AWS CodePipeline은 서버리스 CI/CD 서비스로, 코드 변경부터 배포까지 자동화된 워크플로우를 제공합니다. 하지만 복잡한 인프라 환경에서 <strong>권한 오류</strong>, <strong>아티팩트 누락</strong>, <strong>빌드 스크립트 실패</strong> 등 다양한 문제가 발생할 수 있습니다. 이 가이드에서는 CodePipeline의 기본 구성부터 모니터링, 트러블슈팅, 예방 조치까지 단계별로 설명합니다. 실제 동작하는 코드 예제와 AWS 공식 문서를 참고해 문제를 체계적으로 해결하는 방법을 제시합니다.</p>
<hr>
<h2 id="1-튜토리얼-codepipeline-기본-구성-및-모니터링">1. 튜토리얼: CodePipeline 기본 구성 및 모니터링</h2>
<h3 id="11-codepipeline-구조-이해">1.1 CodePipeline 구조 이해</h3>
<p>CodePipeline은 <strong>Source → Build → Deploy</strong> 3단계로 구성됩니다. 각 단계는 독립적인 액션으로 관리되며, 실패 시 롤백이 가능합니다. 예를 들어, GitHub에서 코드를 가져온 후 CodeBuild로 빌드하고, CodeDeploy로 EC2에 배포하는 파이프라인을 구성할 수 있습니다.</p>
<blockquote>
<p><strong>팁</strong>: 파이프라인 설계 시 각 단계의 출력 아티팩트가 다음 단계로 전달되는지 확인해야 합니다. S3 버킷 권한 문제로 아티팩트가 누락되면 파이프라인이 중단됩니다.</p>
</blockquote>
<h3 id="12-cloudwatch-로그-연동-방법">1.2 CloudWatch 로그 연동 방법</h3>
<p>CodePipeline 자체의 로그는 제한적이므로, 각 단계에서 CloudWatch Logs를 활성화해야 합니다. 예를 들어 CodeBuild 프로젝트의 로그 그룹을 생성하려면 다음 AWS CLI 명령어를 사용합니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># CodeBuild 로그 그룹 생성</span>
</span></span><span style="display:flex;"><span>aws logs create-log-group <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --log-group-name /aws/codebuild/your-project-name <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --retention-in-days <span style="color:#a5d6ff">14</span>
</span></span></code></pre></div><h3 id="13-파이프라인-상태-확인">1.3 파이프라인 상태 확인</h3>
<ul>
<li><strong>AWS Management Console</strong>: CodePipeline 대시보드에서 각 액션의 상태(Success/Failed)를 확인할 수 있습니다. 실패 시 상세 오류 메시지를 클릭하면 원인(예: <code>IAM 역할 권한 부족</code>)이 표시됩니다.</li>
<li><strong>AWS CLI</strong>: 다음 명령어로 파이프라인 실행 기록을 조회할 수 있습니다:
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"></code></pre></div></li>
</ul>
<p>aws codepipeline get-pipeline-execution-history <br>
&ndash;pipeline-name my-pipeline <br>
&ndash;max-results 10</p>
<pre tabindex="0"><code>
&gt; **주의**: CLI 사용 시 `AWSCodePipelineRole` 정책이 IAM 사용자/역할에 부여되어 있어야 합니다.

---

## 2. 트러블슈팅: 주요 오류 유형 및 해결 전략

### 2.1 권한 오류 (IAM Role/Policy)
**증상**: `User is not authorized to perform` 오류 발생. **원인**: IAM 역할이나 정책이 특정 AWS 서비스(예: S3, CodeBuild) 접근 권한을 누락한 경우.

**해결 방법**:
1. IAM 콘솔에서 `CodePipeline-Service-Role` 또는 `CodeBuild-Service-Role`을 선택합니다.
2. `AWSCodePipelineRole` 및 `AWSCodeBuildServiceRole` 정책이 연결되었는지 확인합니다.
3. S3 버킷 접근 권한이 필요한 경우 `AmazonS3ReadOnlyAccess`를 추가합니다.

```json
// IAM Policy 예시: S3 접근 권한 추가
{
&#34;Version&#34;: &#34;2012-10-17&#34;,
&#34;Statement&#34;: [
  {
    &#34;Effect&#34;: &#34;Allow&#34;,
    &#34;Action&#34;: [
      &#34;s3:GetObject&#34;,
      &#34;s3:PutObject&#34;
    ],
    &#34;Resource&#34;: &#34;arn:aws:s3:::your-bucket-name/*&#34;
  }
]
}
</code></pre><h3 id="22-아티팩트-누락-s3-버킷-권한">2.2 아티팩트 누락 (S3 버킷 권한)</h3>
<p><strong>증상</strong>: <code>Artifact not found</code> 오류 발생. <strong>원인</strong>: S3 버킷 정책 또는 CodePipeline의 아티팩트 스토어 설정이 잘못된 경우.</p>
<p><strong>해결 방법</strong>:</p>
<ol>
<li>S3 버킷 정책에서 CodePipeline 서비스 프린시팔(<code>codepipeline.amazonaws.com</code>)에 <code>s3:GetObject</code> 및 <code>s3:PutObject</code> 권한을 부여합니다.</li>
<li>CodePipeline 콘솔에서 아티팩트 스토어 위치를 확인하고, 필요시 버킷을 변경합니다.</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># CloudFormation 템플릿 예시: S3 버킷 정책</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#7ee787">Resources</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">  </span><span style="color:#7ee787">PipelineBucketPolicy</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">Type</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">AWS::S3::BucketPolicy</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">Properties</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">      </span><span style="color:#7ee787">Bucket</span>:<span style="color:#6e7681"> </span>!<span style="color:#a5d6ff">Ref PipelineBucket</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">      </span><span style="color:#7ee787">PolicyDocument</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">        </span><span style="color:#7ee787">Statement</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">          </span>- <span style="color:#7ee787">Effect</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">Allow</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">            </span><span style="color:#7ee787">Principal</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">              </span><span style="color:#7ee787">Service</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">codepipeline.amazonaws.com</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">            </span><span style="color:#7ee787">Action</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">              </span>- <span style="color:#a5d6ff">s3:GetObject</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">              </span>- <span style="color:#a5d6ff">s3:PutObject</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">            </span><span style="color:#7ee787">Resource</span>:<span style="color:#6e7681"> </span>!<span style="color:#a5d6ff">Join [&#39;&#39;, [!GetAtt PipelineBucket.Arn, &#39;/*&#39;]]</span><span style="color:#6e7681">
</span></span></span></code></pre></div><h3 id="23-빌드-스크립트-오류">2.3 빌드 스크립트 오류</h3>
<p><strong>증상</strong>: CodeBuild 단계에서 <code>Command failed</code> 오류 발생. <strong>원인</strong>: 빌드 스크립트(예: <code>buildspec.yml</code>)의 문법 오류 또는 의존성 누락.</p>
<p><strong>해결 방법</strong>:</p>
<ol>
<li><code>buildspec.yml</code> 파일을 로컬에서 테스트합니다.</li>
<li>CodeBuild 로그에서 실패한 단계를 확인합니다.</li>
<li>필요한 경우 <code>pip install</code> 또는 <code>npm install</code> 명령어를 추가합니다.</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># buildspec.yml 예시</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#7ee787">version</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">0.2</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#7ee787">phases</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">  </span><span style="color:#7ee787">install</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">runtime-versions</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">      </span><span style="color:#7ee787">python</span>:<span style="color:#6e7681"> </span><span style="color:#a5d6ff">3.9</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">commands</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">      </span>- <span style="color:#a5d6ff">pip install -r requirements.txt</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">  </span><span style="color:#7ee787">build</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span><span style="color:#7ee787">commands</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">      </span>- <span style="color:#a5d6ff">python app.py test</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#7ee787">artifacts</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">  </span><span style="color:#7ee787">files</span>:<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span>- <span style="color:#a5d6ff">dist/*</span><span style="color:#6e7681">
</span></span></span></code></pre></div><hr>
<h2 id="3-검증-및-예방-조치">3. 검증 및 예방 조치</h2>
<h3 id="31-테스트-파이프라인-구축">3.1 테스트 파이프라인 구축</h3>
<p>실제 파이프라인을 변경하기 전, <strong>테스트 브랜치</strong>를 사용해 검증 환경을 구축합니다. 예를 들어, <code>dev</code> 브랜치에서 파이프라인을 실행한 후 성공 시 <code>main</code> 브랜치로 병합하는 전략을 적용할 수 있습니다.</p>
<h3 id="32-sns-연동으로-실시간-알림-설정">3.2 SNS 연동으로 실시간 알림 설정</h3>
<p>파이프라인 실패 시 Slack 또는 이메일로 알림을 받으려면 SNS 토픽을 연동합니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># SNS 토픽 생성 및 CodePipeline에 연결</span>
</span></span><span style="display:flex;"><span><span style="color:#79c0ff">SNS_TOPIC_ARN</span><span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#ff7b72">$(</span>aws sns create-topic --name codepipeline-alerts <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --query <span style="color:#a5d6ff">&#39;TopicArn&#39;</span> --output text<span style="color:#ff7b72">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>aws codepipeline update-pipeline <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --pipeline-name my-pipeline <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --pipeline-configuration <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>    <span style="color:#f85149">&#39;</span><span style="color:#ff7b72;font-weight:bold">{</span>
</span></span><span style="display:flex;"><span>      
</span></span></code></pre></div>]]></content:encoded>
    </item>
  </channel>
</rss>
