ECS FargateをCloudForamtionで作成する方法

  • POSTS
1. はじめに 今回は、ECS FargateをCloudformationで構築する方法を説明していきます。 ECSについて、興味があったのですが、学習できていませんでした。最近時間ができたので、ECS Fargateを構築したので、構築手順をまとめました。 2. ECSとは ECS(Amazon Elastic Container)とは、コンテナ化されたアプリケーションをデプロイ、管理、スケーリングするためのコンテナ管理サービスです。 2.1 ECSを構成する構成要素 2.1.1 クラスター クラスターは、サービスとタスクをグループ化する要素です。 2.1.2 サービス サービスは、コンテナ化されたアプリケーションの実行とスケーリングを容易にする、フルマネージド型のコンテナオーケストレーションサービスです。 サービスで設定できる項目 クラスター サービスやタスクを実行するクラスターを設定する タスク定義 実行するコンテナのリソースや環境変数など デプロイメント ローリングアップデートやCode ターゲット数 サービスが維持するタスク数を設定。 ロードバランサ タスクのトラフィックを分散する ヘルスチェック タスクの健全性を監視する AutoScaling タスク数を自動で増減。CPU使用率やメモリの使用率に基づいて増減する。 ローンチタイプ ECS2かFargateを設定する 2.1.3 タスク タスクは、1つ以上のコンテナをまとめて実行する単位です。ECSでは、アプリケーションをデプロイ・実行する最小単位です。 タスクの実行内容は、タスク定義に基づきます。 タスクで設定できる項目 使用するDockerイメージ コンテナごとのCPU/メモリ割当て ポートマッピング 環境変数 ログ設定 4. 構成図 5. 構築手順 プライベートサブネットにECSを作成する方法です。 5.1 VPC VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 192.168.0.0/20 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: 'vpc' EcsPrivateSubnetAZ: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC AvailabilityZone: !Select [0, !GetAZs ''] CidrBlock: 192.168.0.0/24 MapPublicIpOnLaunch: false Tags: - Key: Name Value: 'ecs-private-subnet' SgEcsSecurityGroup: Type: AWS::EC2::SecurityGroup DependsOn: AlbSecurityGroup Properties: GroupDescription: 'sg-ecs-security-group' GroupName: 'sg-ecs-security-group' SecurityGroupEgress: - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: 0.0.0.0/0 Tags: - Key: Name Value: 'sg-ecs' VpcId: !Ref VPC EcrVpcEndpointSg: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTPS for VPC Endpoints VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: 0.0.0.0/0 CloudWatchVpcEndpointSg: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTPS for VPC Endpoints VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: 0.0.0.0/0 SourceSecurityGroupId: !Ref SgEcsSecurityGroup #---------------------------------------------# # VPC Endpoint # #---------------------------------------------# # プライベートサブネットのECSからECRからイメージ取得するために必要 ECRApiEndpoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ecr.api' VpcId: !Ref VPC VpcEndpointType: Interface SubnetIds: - !Ref EcsPrivateSubnetAZ PrivateDnsEnabled: true SecurityGroupIds: - !Ref EcrVpcEndpointSg Tags: - Key: Name Value: 'ecr-api-endpoint' # プライベートサブネットのECSからECRからイメージ取得するために必要 ECRDockerEndpoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ecr.dkr' VpcId: !Ref VPC VpcEndpointType: Interface SubnetIds: - !Ref EcsPrivateSubnetAZ PrivateDnsEnabled: true SecurityGroupIds: - !Ref EcrVpcEndpointSg Tags: - Key: Name Value: 'dcr-endpoint' # プライベートサブネットのECSからCloudwatchにログ出力するために必要 CloudWatchEndpoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: !Sub 'com.amazonaws.${AWS::Region}.logs' VpcId: !Ref VPC VpcEndpointType: Interface SubnetIds: - !Ref EcsPrivateSubnetAZ PrivateDnsEnabled: true SecurityGroupIds: - !Ref CloudWatchVpcEndpointSg Tags: - Key: Name Value: 'logs-vpc-endpoint' 5.2 クラスター作成 ECSCluster: Type: AWS::ECS::Cluster Properties: ClusterName: cluster CapacityProviders: - FARGATE ClusterSettings: - Name: containerInsights Value: enabled 5.3 サービス作成 ECSService: Type: 'AWS::ECS::Service' Properties: ServiceName: ecs-service Cluster: !Ref ECSCluster TaskDefinition: !Ref FargateTaskDefinition DesiredCount: 1 LaunchType: FARGATE DeploymentController: Type: CODE_DEPLOY NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: DISABLED SecurityGroups: - !Ref SgEcsSecurityGroup Subnets: - !Ref EcsPrivateSubnetAZ LoadBalancers: - ContainerName: dynamo ContainerPort: 8080 TargetGroupArn: !Ref TargetGroup 5.4 タスク定義作成 FargateTaskDefinition: Type: AWS::ECS::TaskDefinition Properties: ContainerDefinitions: # ECRのリポジトリを指定する - Name: test Image: !Sub '${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/xxxxxxx' Cpu: 0 PortMappings: - Name: test ContainerPort: 8080 HostPort: 8080 Protocol: tcp AppProtocol: http Essential: true LogConfiguration: LogDriver: awslogs Options: awslogs-group: /ecs/tests awslogs-region: !Sub ${AWS::Region} awslogs-stream-prefix: ecs Family: ecs-family-name ExecutionRoleArn: !Sub 'arn:aws:iam::${AWS::AccountId}:role/ecs-task-execution-role' NetworkMode: awsvpc Cpu: 1024 Memory: 3072 5.5 ECSロール作成 EcsTaskExecutionRole: Type: AWS::IAM::Role Properties: RoleName: 'ecs-task-execution-role' AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: ecs-tasks.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy Policies: - PolicyName: AllowCloudWatchLogsAccess PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:CreateLogStream - logs:PutLogEvents - logs:DescribeLogStreams - logs:CreateLogGroup Resource: '*' 6. まとめ ECSをCloudFormationで構築してみました。以前、AWSマネジメントコンソールで作成したことがありました。

AWSのCodeFamilyで静的ページをS3デプロイする方法

  • POSTS
1. はじめに このブログ(Cloud Steps)は、CloudFront+S3の構成で静的サイトを運用しています。 ブログを更新する際、S3にファイルをアップロードする必要がありますが、 ブログ更新の度にS3コマンドやAWSマネジメントコンソールからファイルアップロードするのは、少し面倒です。 なので、GitHubへのpushを検知し、CodeFamilyで自動的にS3にファイルの変更を自動で反映できるようしました。 2. Hugoとは Hugoは、オープンソースの静的サイト生成ツールです。 マークダウンファイルを記述すれば、静的ファイルを生成することができ、簡単に、柔軟に、静的サイトを作成することができます。 サイトのデザインはコントリビューターが作成したテーマを適応すれば、自由に変更することができます。また、自分自身でテーマを作成することも可能なので、デザインにこだわりがある人はテーマを作成するのもいいでしょう。 ※ Hugoの導入方法や利用方法は、この記事では対象外とします。 3. CodeFamilyとは CodeFamilyとは、AWSが提供するソフトウェア開発とデプロイメントのライフサイクルを支援するサービス群の総称です。CodeFamilyは、公式なサービス名ではなく、一般的に以下のような 「Code」から始まるAWSサービス群 を指すことが多いです。 CodeFamily CodePipeline CodeBuild CodeDeploy CodeStar(非推奨) このページでは、CodePipeline, CodeBuildについて書いていきます。 3.1 CodeBuild CodeBuildは、フルマネージドの継続的インテグレーションサービスです。 アプリケーションコードのコンパイル、テストを実行などのビルド環境を提供するサービスです。 CodeBuildは、フルマネージドなサービスのため、ユーザーがビルドサーバーのプロビジョニングの必要なく、サーバーのパッチ適用などのメンテナンス作業を必要としません。 3.2 CodePipeline CodePipeline は、継続的インテグレーション(CI)と継続的デリバリー(CD) を自動化するための パイプライン構築サービス です。アプリケーションのコードの変更が本番環境に届くまでの一連の流れ(ビルド、テスト、デプロイなど)をステージごとに視覚的に構成して自動化できます。 4. 構成図 5. パイプライン構築手順 作成するリソース AWSとGithubの接続 CodePipeline CodeBuild IAM 5.1 GitHubとCodePipelineを接続する GitHubとCodePipelineの接続は、AWSマネージメントコンソールから行います。 AWSマネージメントコンソールの検索欄からCodeBuildと検索>左ペインの設定>接続>接続ボタンをクリック。 プロバイダー選択で「GitHub」を選択する。 「GitHubアプリ接続を作成する」に任意の接続名を入力し、「GitHubに接続する」をクリックする。 GitHubの認証情報をきかれるので入力する。 5.2 CodePipelineを作成する CodePipelineでステージを作成する。 Pipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: !Sub "${ProjectName}-pipeline" RoleArn: !GetAtt PipelineRole.Arn ArtifactStore: Type: S3 Location: !Ref ArtifactBucket Stages: - Name: Source Actions: - Name: GitHub_Source ActionTypeId: Category: Source Owner: AWS Provider: CodeStarSourceConnection Version: 1 OutputArtifacts: - Name: SourceOutput Configuration: ConnectionArn: !Ref CodeStarConnectionArn FullRepositoryId: !Ref GitHubRepo BranchName: main DetectChanges: true RunOrder: 1 - Name: Build Actions: - Name: CodeBuild ActionTypeId: Category: Build Owner: AWS Provider: CodeBuild Version: 1 InputArtifacts: - Name: SourceOutput OutputArtifacts: - Name: BuildOutput Configuration: ProjectName: !Ref CodeBuildProject RunOrder: 1 5.3 CodeBuildを作成する CodeBuildProject: Type: AWS::CodeBuild::Project Properties: Name: !Sub '${ProjectName}-hugo-deploy' ServiceRole: !GetAtt CodeBuildServiceRole.Arn Artifacts: Type: CODEPIPELINE Environment: Type: LINUX_CONTAINER ComputeType: BUILD_GENERAL1_SMALL Image: aws/codebuild/standard:7.0 Source: Type: CODEPIPELINE BuildSpec: buildspec.yml 5.4 buildspec.yamlを作成する buildspec.yamlとは、そもそもなんでしょうか。

プライベートサブネットに配置されたECSからVPCを通じてDynamoDBに接続する方法

  • POSTS
1. はじめに 個人プロジェクトでAWSでインフラを構築してた際にプライベートサブネットからDynamoDBに接続する構成を作成しました。 プライベートサブネットからVPCを接続するには、VPCエンドポイントを作成してVPC外のAWSサービスにアクセスする必要があります。 VPCエンドポイントを通してVPC外のAWSサービスにアクセスする方法を解説します。 ※ NatGatewayを利用する方法がありますが、ここでは対象外とします。 2. なぜVPCエンドポイントを利用するのか VPC のプライベートサブネットからVPC外のリソースにアクセスするには、VPCエンドポイントを作成することで可能です。 なぜVPCエンドポイントが必要かというと、プライベートサブネットからVPC外部のAWSサービスにアクセスするための経路がないためです。 2.1 そもそもVPCエンドポイントとは VPCエンドポイントとは、AWSのVPCから、インターネットを経由せずにAWSサービスに安全にアクセスできる仕組みです。 VPCエンドポイントはインターフェース型とゲートウェイ型があります。 DynamoDBとS3はゲートウェイ型で、それ以外のAWSサービスはインターフェース型です。 2.2 インターフェース型エンドポイント ENI(Elastic Network Interface)を使って、VPC内にENI(仮想ネットワークインターフェース)を作成し、対象のサービスにアクセスします。 特徴 多くのAWSサービスに対応している エンドポイントはVPC内にENIとして作成され、プライベートIPが割り当てられる。 セキュリティグループを設定できる。 2.3 ゲートウェイ型エンドポイント VPCルートテーブルを使用して、特定のAWSサービス(現在はS3とDynamoDBのみ)にゲートウェイ経由でアクセスします。 特徴 S3, DynamoDBに対応します。 ルートテーブルにターゲットとして設定する。 セキュリティグループは使えないが、エンドポイントポリシーでアクセス制御が可能です。 3. 構成図 プライベートサブネットのECSからDynamoDBへアクセスする図です。 4. 実際の手順 ここでは、VPCの作成からエンドポイントの作成までの手順を書いていきます。 ゲートウェイエンド型ポイントを通してDynamoDB接続に必要なリソース VPC プライベートサブネット ルートテーブル VPCエンドポイント VPCを作成する。 VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 192.168.0.0/20 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: 'vpc' プライベートサブネットを作成する。 PrivateSubnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC AvailabilityZone: !Select [0, !GetAZs ''] CidrBlock: 192.168.0.0/23 MapPublicIpOnLaunch: false Tags: - Key: Name Value: 'ecs-private-subnet' ルートテーブルを作成する。