LoginSignup
0
1

More than 1 year has passed since last update.

【コード管理/GitHub】CloudFormationのテンプレートをGitHubにpushすると、S3にもアップロードされるように実装する

Last updated at Posted at 2023-04-13

今回の課題

以前、CloudFormationを使って、AWSのリソースをコードで管理するということに挑戦をしたので、
今回は、CloudFormationのコード履歴をGitHubで管理する方法を調査して、実際に実装してみることにした。

◼︎前回の記事

今回実施したこと

GitHub Actionsを使用して、
GitHubにymlファイルをプッシュしたら、S3にも同じファイルがアップロードされる
という機能を実装してみた。

下記の記事を参考にしながら進めた。

実装した手順

1)AWSのリソースを用意する

1)-1.ブロックパブリックアクセス(バケット設定)をオフにする

1)-2でバケットポリシーの編集をするので、
ブロックパブリックアクセス(バケット設定)を無効にしておく。

image.png

ブロックパブリックアクセス(バケット設定)が有効だと、
 バケットポリシーの編集ができない。

1)-2.テンプレートを保存する用のS3バケットを用意する

GitHubにCloudFormationのテンプレートのymlファイルをpushした際に、
ymlファイルが同時にアップロードされるS3バケットを用意しておく。
※今回は、cloudformation-gitというバケットを用意した。

バケットポリシーは編集して、下記に書き換える。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::cloudformation-git/*",
                "arn:aws:s3:::cloudformation-git"
            ]
        }
    ]
}

1)-3.IAMユーザを作成する

まずは、下記のようにIAMポリシーを作成する。

◼︎許可しているポリシー一覧

  • s3:GetObject:バケット内のオブジェクトを取得する。
  • s3:ListBucket:バケットの中身の一覧を閲覧する。
  • s3:PutObject:オブジェクトをバケットに追加する。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::cloudformation-git",
                "arn:aws:s3:::cloudformation-git/*"
            ]
        }
    ]
}

そして、実際にIAMユーザーを作成して、上記のポリシーをアタッチする。
また、IAMユーザーには、アクセスキーIDシークレットアクセスキーを持たせておく。

※IAMユーザーにアクセスキーIDシークレットアクセスキーを持たせる方法は、
 下記の記事が参考になった。

2)GitHubの用意をする

2)-1.Action Secretsにて変数を用意する

cloudformation-gitリポジトリのSettings>Secrets and variablesActionsから、
下記のように変数を保存しておく。

1)-3でIAMユーザーに持たせた、
アクセスキーIDAWS_ACCESS_KEY_ID変数、
シークレットアクセスキーAWS_SECRET_ACCESS_KEY変数として保存する。

また、S3を作成した、
リージョンをAWS_DEFAULT_REGION変数、
バケット名をBUCKET_NAME変数として保存しておく。

↓変数の編集画面
image.png

2)-2.ディレクトリを用意する

GitHubのcloudformation-gitリポジトリの配下に、
下記の構成でディレクトリを配置したいので、
ymlファイルを入れるための.github/workflowsディレクトリとcloudformationディレクトリを用意しておく。

※ymlファイルは後の行程で作成し、ここで作成したディレクトリの中に配置する。

├── .github
│   └── workflows
│       └── cfn_s3_upload.yml
└── cloudformation
    └── sample.yml

2)-3.ワークフローファイルの作成をする

リポジトリ内の.github/workflows/ディレクトリの中のymlファイルで、
GitHub Actionsのワークフローを定義することができる。

下記のようなコードを、
cloudformation-git/.github/workflows/cfn_s3_upload.ymlファイルにて用意し、ワークフローを定義しておく。

2)-1で用意した4つの変数は、下記のコードの${secrets.変数名}の部分に代入される。

# This is a basic workflow to help you get started with Actions

name: CloudFormation S3 Deploy

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master, main ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_DEFAULT_REGION }}

      - name: Copy files to the s3 bucket
        env:
          BUCKET_NAME: ${{ secrets.BUCKET_NAME }}
        run: |
          aws s3 sync ./cloudformation s3://${BUCKET_NAME}

3)AWSでインフラを構築するためのテンプレートを用意する

VScodeなどのエディタでコードを書いて、
下記のような、CloudFormationのテンプレートを用意する。

Description: VPC Create Sample 

Parameters:
  VpcCIDR:
    Description: Please enter the IP range (CIDR notation) for this VPC
    Type: String
    Default: 10.192.0.0/16

  EnvName:
    Description: An environment name that is prefixed to resource names
    Type: String


Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Ref EnvName

4)3)で作成したファイルをGitHubにpushする

GitHubのcloudformationフォルダに3)で作成したテンプレートをpushすると、
2)-3で用意したワークフローが動き、S3にも同じテンプレートファイルがアップされる。

↓この通り、GitHubにpushすると、S3にもアップロードされていた。
image.png

以上で、GitHubにpushしたらS3にもテンプレートがアップロードされる機能が実装できた。

5)クイック作成リンクでスタックを作成する

今回は、PracticeStackという名前のスタックを作成してみる。
下記のURLのフォーマットにリージョン名, バケット名, テンプレート名, スタック名を入れてブラウザで検索すると、スタックのクイック作成の画面に遷移することができる。

https://ca-central-1.console.aws.amazon.com/cloudformation/home?region=ca-central-1#/stacks/quickcreate?templateUrl=https://cloudformation-git.s3.ca-central-1.amazonaws.com/practice.yml&stackName=PracticeStack
# https://[リージョン名].console.aws.amazon.com/cloudformation/home?region=[リージョン名]#/stacks/quickcreate?templateUrl=https://[バケット名].s3.[リージョン名].amazonaws.com/[スタック化したいテンプレートの名前]&stackName=[作成したいスタックの名前]

下記のようにスタック作成画面に遷移できるので、
そのままスタックの作成ボタンを押せば、GitHubにプッシュしたpractice.ymlテンプレートの内容でAWSのリソースを構築することができる。
image.png

最後に、VPCが構築されているか確認してみたところ、テンプレートの内容で問題なくVPCが構築されていた。

まとめ

CloudFormationのテンプレートコードもGitHubで管理できるように実装することができた。

参考記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1