こんにちは、クラウド事業部 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 > スタックの作成 >新しいリソースを使用(標準) からスタックを作成します。
既存のテンプレートを選択 > テンプレートファイルのアップロード >ファイルの選択 から先ほど保存したsample.yamlを選択し次へを押下します。
以下を入力し、次へを押下します。
スタック名:任意のものを入力(バケット名にも含まれるため大文字は使用しない)
IpAdress:許可したいIPアドレス
KeyPair:作成済みの自分が扱えるキーペア
PublicSubnet:作成済みのパブリックサブネット
SecurityGroup:作成済みの操作環境からSSHアクセスを許可したセキュリティグループ
スタックオプションの設定画面では次へ、確認して作成画面では機能欄のチェックボックスを確認して送信を押下します。
スタック作成処理が開始しました。指定したスタック名のスタックがCREATE_COMPLETEの表示になれば作成完了です。
CICDお試し
前段でCloudformationによってリソースを作成したため、前にブログに記載した内容の以下は実施が完了しました。
- EC2用のIAMロール作成
- CodeCommit(git)操作用のEC2の作成
- CodeCommitの作成
- S3バケットの作成
あとは以下作業を実施すればCICDお試しが実施できます。
- CodeCommitの作成(前ブログ該当箇所最後のCodeCommit接続情報を確認を実施)
- EC2でgitの操作
- Codepipelineの作成
- Codepipelineの動作確認
環境を削除する際はCloudformationで作成したリソースに関しては、Cloudformation画面の削除を選択することで実施できます。※S3内にファイル等が存在するとS3バケットを削除できないため事前にバケットを空にする必要があります。
最後に
ブログで前に紹介した内容を一部Cloudformation化することで試しやすくしました。
実際に自分でリソースを一つ一つ作成することで覚えやすいところもありますが、慣れてきたり時間がないときや複数環境を作成したいときはCloudformationが便利です。