Posts

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' ルートテーブルを作成する。