タイトル AWSクラウドフォーメーションとは
本文

AWSクラウドフォーメーションとは

AWS CloudFormationは、Amazon Web ServicesAWS)で使えるすごいツールです。これは、クラウド上でアプリケーションやリソースを作成、設定、管理する手助けをしてくれるものです。

 

考えてみてください。あなたが家を建てるとき、最初に設計図を作りますよね?それと同じように、CloudFormationAWSリソースの設計図を提供します。この設計図には、サーバー、データベース、ネットワーク、セキュリティ設定などが含まれます。

 

そして、設計図ができたら、CloudFormationが自動的に設計通りにAWS上にリソースを作成してくれるんです。これにより、手作業で設定ミスをする心配がなくなり、迅速かつ正確なリソースのプロビジョニングが可能になります。

 

また、あなたがアプリケーションをアップデートしたり、変更したりする必要がある場合でも、CloudFormationは設計通りにリソースを変更してくれます。これは、アプリケーションの成長や変化に合わせて柔軟に対応できる大きな利点です。

 

簡単に言えば、AWS CloudFormationAWSクラウド上で自動化を実現し、手間を省き、確実性を高めるツールなんです。アプリケーションの展開や変更が簡単になり、時間と労力を節約できます。

 

AWS CloudFormationは、Amazon Web ServicesAWS)のリソースを簡単に管理できる素晴らしいツールです。これを使うと、アプリケーションやリソースを素早く、確実に設定できます。

 

最大のメリットは、AWSリソースをコードで定義できることです。これにより、手動で設定ミスをしないし、設定を簡単に再利用できます。そして、リソースの変更や削除も簡単に行えます。

AWS CloudFormationを使うと、以下のようなメリットがあります:

 

自動化: リソースの作成、設定、更新、削除をコードで管理できるので、繰り返しの作業や手動ミスを減らせます。

 

迅速なデプロイメント: アプリケーションやインフラストラクチャを迅速に構築でき、開発プロセスを加速できます。

 

スケーラビリティ: アプリケーションの成長に合わせてリソースを簡単にスケーリングできます。

 

一貫性: リソースの設定がコードで管理されているため、一貫性が保たれます。

 

ドキュメンテーション: テンプレートはアーキテクチャや設定の文書として機能し、ドキュメンテーションに役立ちます。

 

最終的なメリットは、AWS CloudFormationを使ってAWS上でのアプリケーション展開やリソース管理がスムーズになることです。手間を減らし、確実性を高め、迅速なデプロイメントを実現できます。

YAMLテンプレートの基本的な構造:

 

CloudFormationテンプレートはYAMLまたはJSON形式で記述できます。ここではYAML形式に焦点を当てます。基本的なテンプレート構造は以下のようになります:

AWSTemplateFormatVersion: '2010-09-09'
Description: "テンプレートの説明"
 
Resources:
  ResourceLogicalName:
    Type: AWS::ResourceType
    Properties:
      Property1: Value1
      Property2: Value2
 
Parameters:
  ParameterName:
    Type: String
    Description: "パラメータの説明"
 
Outputs:
  OutputLogicalName:
    Description: "アウトプットの説明"
    Value: !Ref ResourceLogicalName

主要な要素と注意点:

 

AWSTemplateFormatVersion: テンプレートのバージョンを指定します。AWSが提供するテンプレートバージョンに合わせて設定します。

 

Description: テンプレートの説明を提供します。テンプレートの目的や内容を簡潔に説明します。

 

Resources: リソースを定義します。AWSリソース(EC2インスタンス、S3バケット、RDSデータベースなど)を指定したリソース論理名とともに定義します。各リソースにはTypePropertiesが含まれます。

 

Parameters: テンプレートのパラメータを定義します。ユーザーがテンプレートを使用する際に指定できる値を設定します。パラメータのタイプ、デフォルト値、説明を指定できます。

 

Outputs: スタックの出力を定義します。出力を通じてスタック内のリソースにアクセスできるようになります。出力の説明と値を指定します。































 

注意点:

 

インデント: YAMLはインデントを使用して構造を表現するため、正確なインデントが重要です。スペース2つまたはスペース4つを使用してインデントしますが、スペースとタブを混在させないように注意してください。

 

ダブルクォーテーション: ダブルクォーテーションで囲まれた文字列を指定する場合、適切にエスケープする必要があります。

 

リファレンス: !Ref を使用してリソースやパラメータを参照できます。たとえば、!Ref ResourceLogicalName はリソースへの参照を作成します。

 

コメント: YAMLテンプレートでは
#
を使用してコメントを追加できます。コメントはテンプレートの可読性を向上させるのに役立ちます。

 

エラーチェック: テンプレートにはエラーチェック機能があり、不正なリソースやパラメータの設定がある場合、CloudFormationがエラーメッセージを提供します。

 

テンプレートの作成とデバッグは継続的なプロセスであり、複雑なアプリケーションを展開する場合には慎重に行う必要があります。AWSの公式ドキュメンテーションとテンプレート例を参考にすることをお勧めします。 

AWS CloudFormationを使用してEC2インスタンスを構築するためのシンプルなCloudFormationテンプレートを以下に示します。このテンプレートは、EC2インスタンスを起動し、基本的な設定を指定します。※この内容を行うためにはEC2キーペアを作成しておく必要があります。

  

AWSTemplateFormatVersion: '2010-09-09'

Description: "EC2"


Resources:

  MyEC2Instance: # EC2インスタンスの定義

    Type: AWS::EC2::Instance

    Properties:

      ImageId: ami-xxxxxxxxxxxx# AMI IDを指定

      InstanceType: t2.micro # インスタンスタイプを指定

      KeyName: xxxxxx # EC2キーペア名を指定



































 

このテンプレートの主要な要素は以下です:

 

AWSTemplateFormatVersion: CloudFormationテンプレートのバージョンを指定します。

Description: テンプレートの説明を提供します。

そして、Resources セクションでEC2インスタンスを定義しています:

 

MyEC2Instance: インスタンスのリソース名を指定します。

Type: リソースのタイプをAWS::EC2::Instanceに設定します。

Properties: インスタンスのプロパティを指定します。

ImageId: インスタンスの起動に使用するAMIAmazon Machine Image)のIDを指定します。

EC2のOS選択画面に記載してあります。

InstanceType: インスタンスのタイプを指定します。ここではt2.microを使用していますが、必要に応じて変更できます。

KeyName: インスタンスにアクセスするためのEC2キーペアの名前を指定します。keynameには.pemなどの拡張子は不要

SecurityGroups: インスタンスに関連付けるセキュリティグループのIDを指定します。

このテンプレートを使用して、AWS CloudFormationスタックを作成または更新することで、EC2インスタンスをプロビジョニングできます。必要に応じて他のリソースや設定を追加し、EC2インスタンスの詳細な構成を指定できます。


 

AWS CloudFormationを使用してAmazon RDSをデータベースサーバーとして構築する例です:

AWSTemplateFormatVersion: '2010-09-09'

Description: "Amazon RDSデータベースを作成するCloudFormationテンプレート"

 

Resources:

 
MyDBInstance:

   
Type: AWS::RDS::DBInstance

   
Properties:

     
DBName: MyDatabase

     
AllocatedStorage: 20

     
DBInstanceClass: db.t2.micro

     
Engine: MySQL

     
MasterUsername: admin

     
MasterUserPassword: mypassword

 

このテンプレートでは、Amazon RDSデータベースを定義しています。詳細な設定やセキュリティグループなどをカスタマイズすることができます。また、Amazon DynamoDBを使用する場合にも同様にテンプレートを定義できますが、データベースサーバーとしてRDSが一般的です。







































 

AWS CloudFormationを使用してS3バケットを作成するCloudFormationテンプレートの例を提供します。このテンプレートは、新しいS3バケットを作成します。

 

AWSTemplateFormatVersion: '2010-09-09'

Description: "S3バケットを作成するCloudFormationテンプレート"

 

Resources:

 
MyS3Bucket:

   
Type: AWS::S3::Bucket

   
Properties:

     
BucketName: my-unique-bucket-name #
バケット名を指定

 

このテンプレートでは、AWS::S3::Bucket リソースタイプを使用してS3バケットを定義しています。詳細な設定、アクセス制御、ポリシーなどを追加することもできます。

 

テンプレート内の BucketName プロパティに、バケットの一意の名前を指定することが必要です。S3バケットの名前はグローバルに一意でなければならず、AWSリージョン全体で一意である必要があります。したがって、バケット名には他のAWSユーザーが使用していない一意の名前を選択する必要があります。

 

このテンプレートを使用して、CloudFormationスタックを作成または更新することで、S3バケットをプロビジョニングできます。必要に応じて、S3バケットのポリシーやアクセスコントロールなどをカスタマイズすることができます。

AWS Identity and Access Management (IAM) を使用して、特定のリソースへのアクセス権を付与するAWS CloudFormationテンプレートの例です。このテンプレートでは、IAMユーザー、ポリシー、およびそのユーザーに関連付けられたIAMロールを定義します。IAMユーザーがAmazon S3バケットにアクセスできるように設定されています。

 

AWSTemplateFormatVersion: '2010-09-09'

Description: "IAMユーザー、ポリシー、ロールの作成を行うCloudFormationテンプレート"

 

Resources:

 
MyIAMUser:

   
Type: AWS::IAM::User

   
Properties:

     
UserName: my-iam-user # IAM
ユーザーの名前を指定

 

 
MyS3Policy:

   
Type: AWS::IAM::Policy

   
Properties:

     
PolicyName: MyS3AccessPolicy

     
PolicyDocument:

       
Version: '2012-10-17'

       
Statement:

         
- Effect: Allow

           
Action:

              - s3:ListBucket

           
Resource:

              - arn:aws:s3:::my-s3-bucket-name
# S3
バケットのARNを指定

         
- Effect: Allow

           
Action:

              - s3:GetObject

           
Resource:

              -
arn:aws:s3:::my-s3-bucket-name/* # S3
オブジェクトのARNを指定

     
Users:

       
- Ref: MyIAMUser

 

 
MyIAMRole:

   
Type: AWS::IAM::Role

   
Properties:

     
RoleName: MyEC2Role

     
AssumeRolePolicyDocument:

       
Version: '2012-10-17'

       
Statement:

         
- Effect: Allow

           
Principal:

              Service: ec2.amazonaws.com

           
Action: sts:AssumeRole

     
ManagedPolicyArns:

       
- "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess" # Amazon S3
の読み取り専用アクセスポリシー

 

Outputs:

 
IAMUserName:

   
Description: "IAM
ユーザー名"

   
Value: !Ref MyIAMUser

 

 
IAMRoleName:

   
Description: "IAM
ロール名"

   
Value: !Ref MyIAMRole

















































































































































 

このテンプレートの要点は次のとおりです:

 

MyIAMUser: IAMユーザーを定義します。ユーザー名を指定しています。

 

MyS3Policy: IAMポリシーを定義します。このポリシーは、S3バケットおよびオブジェクトへの読み取りアクセスを許可します。ポリシーはIAMユーザーにアタッチされます。

 

MyIAMRole: IAMロールを定義します。EC2インスタンスにアタッチするIAMロールで、AssumeRoleポリシーとS3読み取り専用ポリシーがアタッチされています。

 

Outputs: テンプレートの出力セクションで、IAMユーザーとIAMロールの名前を出力します。

 

このテンプレートを使用して、IAMユーザー、ポリシー、ロールが作成されます。IAMユーザーとIAMロールは、AWSリソースへのアクセスに使用できます。ポリシーの内容やアクセス許可をカスタマイズして、特定のリソースに対するアクセス権を制御できます。

 































 

ECSElastic
Container Service
)とECRElastic
Container Registry
)は、Dockerコンテナベースのアプリケーションをデプロイ、管理、および実行するためのAWSのサービスですが、それぞれ異なる役割を果たします。以下に、ECSECRの違いを説明し、ECSからECRに変更する方法を示します。

 

ECSElastic
Container Service
:

 

ECSは、Dockerコンテナを実行するためのオーケストレーションサービスです。複数のDockerコンテナをクラスター内で実行し、スケーリング、ロードバランシング、アプリケーションのデプロイなどの機能を提供します。

ECSクラスター内で実行されるコンテナは、ECSタスクとして定義され、タスクのスケジュールや監視をECSが管理します。

ECSは、コンテナ化されたアプリケーションの実行と管理に特化しており、コンテナのイメージの保管庫としてはECRを使用することが一般的です。

 

ECRElastic
Container Registry
:

 

ECRは、Dockerイメージのプライベートなイメージレジストリサービスです。Dockerイメージを保存、管理、配布するために使用されます。

ECRは、Dockerコンテナイメージを保存する場所であり、セキュアなイメージのプライベートレジストリを提供します。

ECRに保存されたイメージは、ECSEKSElastic Kubernetes Service)、Docker Composeなどのコンテナオーケストレーションプラットフォームから使用できます。

 

ECSからECRに変更する場合、通常は以下のステップを実行します:

 

Dockerイメージのビルド: アプリケーションのDockerコンテナイメージをビルドします。これにはDockerfileを使用してコンテナを設定し、必要なアプリケーションファイルを含める作業が含まれます。

 

DockerイメージをECRにプッシュ: ビルドしたDockerイメージをECRにプッシュします。ECRにイメージを格納するためのリポジトリを作成し、イメージをそのリポジトリにプッシュします。

 

ECSタスク定義の更新: ECSタスク定義を更新し、新しいDockerイメージを使用するように指定します。これにより、ECSは新しいイメージを使用してコンテナを起動します。

 

ECSクラスターの更新: ECSクラスターに新しいタスク定義を適用し、新しいバージョンのコンテナをデプロイします。

 

これにより、ECSで実行されるアプリケーションの新しいバージョンがECRから提供されます。アプリケーションの変更が反映されると、ECSは新しいコンテナを自動的に起動し、アプリケーションの更新が行われます。

 

要するに、ECRDockerイメージの保存庫であり、ECSはそれらのイメージを実行するためのオーケストレーションプラットフォームです。アプリケーションをデプロイする際、Dockerイメージの変更が必要な場合、ECRに新しいイメージをプッシュし、ECSでそのイメージを使用するように設定します。

 

ECSElastic
Container Service
)からECRElastic
Container Registry
)に変更するためのAWS CloudFormationテンプレートを提供します。このテンプレートでは、新しいECRリポジトリを作成し、ECSタスク定義を更新して、コンテナイメージをECRから取得するように設定します。

 

AWSTemplateFormatVersion: '2010-09-09'

Description: "ECSからECRへの変更を実現するCloudFormationテンプレート"

 

Resources:

 
MyECRRepository:

   
Type: AWS::ECR::Repository

   
Properties:

     
RepositoryName: my-ecr-repo-name # ECR
リポジトリの名前を指定

 

 
MyECSUpdateTaskDefinition:

   
Type: AWS::ECS::TaskDefinition

   
Properties:

     
Family: my-ecs-task-family

     
NetworkMode: awsvpc

     
RequiresCompatibilities:

       
- EC2

     
ContainerDefinitions:

       
- Name: my-container

         
Image: !GetAtt MyECRRepository.RepositoryUri:latest # ECR
から最新のイメージを取得

         
PortMappings:

           
- ContainerPort: 80

 

このテンプレートの要点は次のとおりです:

 

MyECRRepository: ECRリポジトリを定義します。このリポジトリは、ECSタスクで使用されるコンテナイメージを格納するためのものです。

 

MyECSUpdateTaskDefinition: ECSタスク定義を定義します。このタスク定義は、新しいECRリポジトリからコンテナイメージを取得するように設定されています。Image プロパティは !GetAtt MyECRRepository.RepositoryUri:latest となっており、ECRリポジトリから最新のイメージを取得するためにリポジトリのURIを使用しています。

 

このテンプレートを使用して、新しいECRリポジトリを作成し、ECSタスク定義を変更して、ECSタスクが新しいECRリポジトリからコンテナイメージを取得するように設定できます。このプロセスを使用することで、ECSからECRへの変更が実現されます。

 

また、このテンプレートでは簡略化された例であり、実際のアプリケーションに合わせて必要な他の設定(セキュリティグループ、ロードバランサー、タスクの設定など)を追加する必要があります。

































































































































 

DjangoアプリケーションをAWS
Elastic Beanstalk
を使用してリバースプロキシとして公開するためのAWS
CloudFormation
テンプレートを作成する場合、以下のようにコメントを含んだYAMLファイルを作成できます。

 

AWSTemplateFormatVersion: '2010-09-09' #
CloudFormation
のテンプレートバージョン

 

Description: "DjangoアプリケーションをAWS Elastic Beanstalkを使用してデプロイするテンプレート"

 

Parameters: # パラメータの定義

 
DjangoAppVersion:

   
Type: String

   
Description: "Django
アプリケーションのバージョン"

 
EnvironmentName:

   
Type: String

   
Description: "Elastic Beanstalk
環境の名前"

 
InstanceType:

   
Type: String

   
Description: "EC2
インスタンスのタイプ"

   
Default: "t2.micro"

 
DjangoSecretKey:

   
Type: String

   
Description: "Django
のシークレットキー"

 

Resources: # リソースの定義

 
ElasticBeanstalkApplication: # Elastic Beanstalk
アプリケーションの定義

   
Type: AWS::ElasticBeanstalk::Application

   
Properties:

     
ApplicationName: !Ref EnvironmentName

 

 
ElasticBeanstalkEnvironment: # Elastic Beanstalk
環境の定義

   
Type: AWS::ElasticBeanstalk::Environment

   
Properties:

     
ApplicationName: !Ref ElasticBeanstalkApplication

     
EnvironmentName: !Ref EnvironmentName

     
SolutionStackName: "64bit Amazon Linux 2 v5.4.0 running Python
3.8" # Django
に適したプラットフォームを指定

     
OptionSettings:

       
- Namespace: "aws:elasticbeanstalk:container:python"

         
OptionName: "WSGIPath"

         
Value: "your_project_name.wsgi:application" # Django
プロジェクトのWSGIエントリポイントを指定

       
- Namespace: "aws:elasticbeanstalk:container:python"

         
OptionName: "NumProcesses"

         
Value: "1" #
プロセス数を設定

 

Outputs: # 出力の定義

 
DjangoAppURL:

   
Description: "Django
アプリケーションのURL"

   
Value: !Sub http://${EnvironmentName}.elasticbeanstalk.com/

 

 

このテンプレートは、DjangoアプリケーションのAWS Elastic Beanstalkデプロイメントを作成します。各行のコメントに従って、適切なパラメータやオプションをカスタマイズしてください。また、your_project_name.wsgi:applicationの部分を実際のDjangoプロジェクトのWSGIエントリポイントに置き換えてください。

 

このテンプレートは、Elastic Beanstalkを使用してDjangoアプリケーションをデプロイし、公開する基本的なスケルトンです。デプロイメントにはさらに多くの設定が必要かもしれません(データベース、環境変数、セキュリティ設定など)。

 

 















































































































 

AWS CloudFormationを使用してCI/CDパイプラインを構築することは可能ですが、完全なCI/CDパイプラインを構築するためにはAWS CodePipelineAWS CodeBuildAWS CodeDeployなどのAWSCI/CDサービスを活用することが一般的です。ただし、CloudFormationを使用してインフラストラクチャを定義し、パイプラインの一部を管理することはできます。以下は、CloudFormationテンプレートのサンプルです。

 

この例では、簡単なウェブアプリケーションのCI/CDパイプラインを作成します。AWS CodePipelineを使用し、GitHubからのソースコードをビルドし、テストしてからAmazon S3にデプロイします。このテンプレートは概念の理解を助けるために提供されたもので、実際のプロジェクトに適応する際にはさらにカスタマイズが必要です。

 

Resources:

  #
GitHub
リポジトリからソースコードを取得するCodePipelineパイプライン

 
MyCodePipeline:

   
Type: "AWS::CodePipeline::Pipeline"

   
Properties:

     
Name: MyCI/CDPipeline

     
RoleArn: <YourPipelineRoleArn>

     
ArtifactStore:

       
Type: S3

       
Location: <YourS3Bucket>

     
Stages:

       
- Name: Source

         
Actions:

           
- Name: SourceAction

              ActionTypeId:

                Category: Source

        
       Owner: ThirdParty

                Version: 1

                Provider: GitHub

              Configuration:

                Owner: <GitHubOwner>

                Repo: <GitHubRepo>

                Branch: master

                OAuthToken:
<GitHubOAuthToken>

              OutputArtifacts:

                - Name: SourceOutput

           
#
他のステージ(ビルド、デプロイ、テスト)をここに追加する

 

# CodeBuildプロジェクトの定義

 
MyCodeBuildProject:

   
Type: AWS::CodeBuild::Project

   
Properties:

      Name: MyCodeBuildProject

     
Source:

       
Type: CODEPIPELINE

       
BuildSpec: |

         
version: 0.2

         
phases:

           
install:

              runtime-versions:

                python: 3.8

           
build:

              commands:

                - echo "Build started on
`date`"

                - # ビルドスクリプトを追加

           
post_build:

              commands:

                - echo "Build completed on
`date`"

     
Environment:

       
ComputeType: BUILD_GENERAL1_SMALL

       
Image: aws/codebuild/standard:4.0

     
ServiceRole: <YourCodeBuildServiceRole>

# デプロイアクションの定義(S3へのデプロイ)

 
MyDeployAction:

   
Type: "AWS::CodePipeline::Pipeline"

   
Properties:

     
ActionName: Deploy

     
RoleArn: <YourDeployActionRoleArn>

     
RunOrder: 1

     
InputArtifacts:

       
- Name: SourceOutput

     
OutputArtifacts:

       
- Name: DeployOutput

     
Configuration:

       
ApplicationName: <YourApplicationName>

       
S3Bucket: <YourS3Bucket>

       
S3ObjectKey: <YourS3ObjectKey>

     
ActionTypeId:

       
Category: Deploy

       
Owner: AWS

       
Provider: S3

       
Version: 1

 





























































































































































このCloudFormationテンプレートは、AWS CodePipelineをセットアップし、GitHubからのソースコードを取得し、CodeBuildプロジェクトでビルドし、S3にデプロイする基本的なCI/CDパイプラインの一部を定義しています。各リソースの設定には独自の値とアクセス許可が必要です。また、ビルドスクリプトとデプロイ設定もカスタマイズする必要があります。このサンプルは概要を示すものであり、実際のプロジェクトに合わせて調整する必要があります。

日付 2023年10月11日0:50