APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【一部Cloudformation化】CodeCommit、CodePipelineを使って簡易CICD

こんにちは、クラウド事業部 CI/CDサービスメニューチームの島田です。

以前CICDの入門サンプルとしてS3へのデプロイをCodeCommit、CodePipelineを使って実施する方法をご紹介しました。
techblog.ap-com.co.jp

それをもう少し試しやすくするCloudformationテンプレートを作成したので記事に残しておきます。
※CloudformationとはいわゆるIaCサービスで、リソースの作成や設定を記述したテンプレートを利用してリソース作成等を実施してくれるAWSサービスです。

やりたいこと

  • CICDを試すにあたり、Cloudformationを利用してCI部分前(EC2、S3、CodeCommit)を作成
  • 実際に上記リソースを作る際に設定が必要なEC2ロール、バケットポリシーなどもCloudformationで作成
  • デプロイ部分(Codepipeline)の設定やgitコマンド関連は手動で実施

前提

  • ユーザーはCloudformationやCloudformationで作成するリソースを扱う権限を持っていること
  • VPCは事前に作成済み
  • 作成したVPCにパブリックサブネットがある
  • キーペアは事前に作成済み
  • 操作環境からSSHアクセスを許可するセキュリティグループを作成済み
  • 操作環境はTeraterm等を利用してEC2にログインできる環境

実施事項

Cloudformationスタックの作成

メモ帳を開き、以下内容をsample.yaml等の名前で保存します。

AWSTemplateFormatVersion: "2010-09-09"
Description: "test codecommit pipeline"
Parameters:
  PublicSubnet:
    Type: String
  KeyPair:
    Type: AWS::EC2::KeyPair::KeyName
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup::Id
  IpAdress:
    Type: String
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
    
Resources:
  Ec2Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ec2role-${AWS::StackName}
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AWSCodeCommitFullAccess
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
            Action:
              - "sts:AssumeRole"

  InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
        - !Ref Ec2Role

  Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0c1de55b79f5aff9b
      KeyName: !Ref KeyPair
      InstanceType: t2.micro
      NetworkInterfaces: 
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnet
          GroupSet:
            - !Ref SecurityGroup
      IamInstanceProfile: !Ref InstanceProfile
      Tags:
        - Key: Name
          Value: !Sub ec2-${AWS::StackName}
  
  CodeCommit:
    Type: AWS::CodeCommit::Repository
    Properties:
      RepositoryName: !Sub CodeCommit-${AWS::StackName}
      RepositoryDescription: Test Repository
  S3:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Join ['-', [!Sub 's3-${AWS::StackName}', !Select [0, !Split ['-', !Select [2, !Split ['/', !Ref 'AWS::StackId' ]]]]]]
      WebsiteConfiguration :
        ErrorDocument : index.html
        IndexDocument: index.html
          
  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Sid: Allow
            Action: s3:GetObject
            Effect: Allow
            Resource:
              - !Sub arn:aws:s3:::${S3}/*
            Condition:
              IpAddress:
                aws:SourceIp: !Ref IpAdress
            Principal: "*"
          - Sid: Deny
            Action: s3:GetObject
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${S3}/*
            Condition:
              NotIpAddress:
                aws:SourceIp: !Ref IpAdress
            Principal: "*"
            

AWSコンソール上でCloudformation > スタックの作成 >新しいリソースを使用(標準) からスタックを作成します。

Cloudformationスタックの作成①

既存のテンプレートを選択 > テンプレートファイルのアップロード >ファイルの選択 から先ほど保存したsample.yamlを選択し次へを押下します。

Cloudformationスタックの作成②

以下を入力し、次へを押下します。

スタック名:任意のものを入力(バケット名にも含まれるため大文字は使用しない)
IpAdress:許可したいIPアドレス
KeyPair:作成済みの自分が扱えるキーペア
PublicSubnet:作成済みのパブリックサブネット
SecurityGroup:作成済みの操作環境からSSHアクセスを許可したセキュリティグループ

Cloudformationスタックの作成③

スタックオプションの設定画面では次へ、確認して作成画面では機能欄のチェックボックスを確認して送信を押下します。

Cloudformationスタックの作成④

スタック作成処理が開始しました。指定したスタック名のスタックがCREATE_COMPLETEの表示になれば作成完了です。

Cloudformationスタックの作成⑤

CICDお試し

前段でCloudformationによってリソースを作成したため、前にブログに記載した内容の以下は実施が完了しました。

  • EC2用のIAMロール作成
  • CodeCommit(git)操作用のEC2の作成
  • CodeCommitの作成
  • S3バケットの作成

あとは以下作業を実施すればCICDお試しが実施できます。

  • CodeCommitの作成(前ブログ該当箇所最後のCodeCommit接続情報を確認を実施)
  • EC2でgitの操作
  • Codepipelineの作成
  • Codepipelineの動作確認

環境を削除する際はCloudformationで作成したリソースに関しては、Cloudformation画面の削除を選択することで実施できます。※S3内にファイル等が存在するとS3バケットを削除できないため事前にバケットを空にする必要があります。

最後に

ブログで前に紹介した内容を一部Cloudformation化することで試しやすくしました。
実際に自分でリソースを一つ一つ作成することで覚えやすいところもありますが、慣れてきたり時間がないときや複数環境を作成したいときはCloudformationが便利です。