CloudFormation 변경 세트를 보기 쉬운 표로 만들어 GitHub에 댓글 달기

개요



타이틀의 건을 GitHub Actions와 쉘 스크립트로 실현합니다. ▼



본문



AWS CloudFormation (이하 CFn)의 관리 콘솔에서는 변경 세트의 내용을 표에서 확인할 수 있습니다. ▼

AWS CLI에서도 변경 세트의 내용을 얻을 수 있습니다. 다만 돌아오는 JSON은 인간이 읽을 수 있는 느낌이 아닙니다. ▼
$ aws cloudformation describe-change-set --change-set-name $changeset_id

{とても長いJSONが返ってくる}

그래서이 JSON을 jq 명령으로 괴롭히고 Markdown 테이블로 만듭니다. 또한 GitHub의 끌어오기 요청에 댓글을 달겠습니다.

jq로 좋은 느낌



쉘 스크립트를 만듭니다. 이것을 CI/CD로 사용합니다. ▼

output_changeset_as_markdown.sh
# 前略
changeset_id=$1
changeset_json=$(aws cloudformation describe-change-set --change-set-name $changeset_id)
stack_name=$(echo "$changeset_json" | jq -r .StackName)
changes=$(echo "$changeset_json" | jq -r .Changes)
changes_length=$(echo "$changes" | jq length)
echo "<details><summary><code>$stack_name ($changes_length changes)</code></summary>" # クリックで展開できるやつ
echo
if [ $changes_length -gt 0 ]; then
echo '|Action|論理ID|物理ID|リソースタイプ|置換|' # 少しでも横幅を減らすためにActionだけ英語
echo '|---|---|---|---|---|'
for i in $( seq 0 $(($changes_length - 1)) ); do
  row=$(echo "$changes" | jq -r .[$i].ResourceChange)
  col_1=$(echo "$row" | jq -r .Action)
  col_2=$(echo "$row" | jq -r .LogicalResourceId)
  col_3=$(echo "$row" | jq -r .PhysicalResourceId | sed -e 's/null/-/') # nullの場合'-'を表示
  col_4=$(echo "$row" | jq -r .ResourceType | sed -e 's/AWS:://') # リソースタイプの'AWS::'は省略
  col_5=$(echo "$row" | jq -r .Replacement | sed -e 's/null/-/' | sed -e 's/True/\*\*True\*\*/') # nullの場合'-'を表示。Trueなら太字にする
  echo "|$col_1|$col_2|$col_3|$col_4|$col_5|"
done
fi
echo '<ul><li><details><summary>view json</summary>' # インデントを付ける目的でリストにしている
echo
echo '```json'
echo "$changeset_json"
echo '```'
echo '</details></li></ul></details>'

CI/CD에서 풀 요청에 댓글 달기



다음은 GitHub Actions의 예입니다.

이번에는 sticky-pull-request-comment 을 사용하여 풀 요청의 주석을 Upsert (없으면 Insert, 있으면 Update)합니다.

[참고] GitHub Actions에서 PR에 동일한 종류의 주석을 Upsert로 추가하는 방법

워크플로는 다음과 같이 합니다. ▼

workflow.yml
# 前略(以下はjobのsteps)
- name: Make comment body
  id: make-cfn-comment
  run: |
    comment_body_file="/tmp/pr_comment_body.txt" # 出力先ファイル

    # コメント本文の作成($changeset_id_listは変更セットのID一覧)
    for id in $(echo "$changeset_id_list"); do
      ./scripts/output_changeset_as_markdown.sh $id >> ${comment_body_file}
    done

    # タイトルの追加
    comment_title="### CFn change sets"
    sed -i "1i ${comment_title}" ${comment_body_file}

    # 次のステップで使うためにset-output
    echo ::set-output name=header::changeset-comment # 後述
    echo ::set-output name=result::${comment_body_file} # 出力先ファイル


- name: Comment on pull request
  uses: marocchino/sticky-pull-request-comment@v1
  with:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    header: ${{ steps.make-cfn-comment.outputs.header }} # 同じheaderのコメントがすでにある場合は上書きされる
    path: ${{ steps.make-cfn-comment.outputs.result }} # 出力したファイルのパス

완성된 것



통상은 스택명의 일람만으로 하는 것으로 코멘트의 표시 사이즈가 커지는 것을 억제하면서... ▼


스택 이름을 클릭하여 테이블을 볼 수 있습니다. ▼

▶ view json를 클릭하여 원래 JSON을 볼 수도 있습니다. ▼


요약



GitHub에서 CFn의 변경 세트를 확인할 수 있게 되어 매우 편리하게 되었습니다 😊

좋은 웹페이지 즐겨찾기