Twitter
Facebook
Hatena
AWS CDKによるAWS環境構築を、GitHub Actionsを使用して自動化するベストプラクティス<準備編>

GitHub Actionsでソースコードを管理しAWSへデプロイするケースはよくあると思います。しかし、適切に認証情報を管理しないと思わぬ事故が発生してしまいます。 今回はAWS CDKによるAWS環境をGitHib Actionsを使用して自動でデプロイする環境を対象に、ベストプラクティスに沿った権限設定の方法をご紹介します。

本コラムでは準備編として、開発環境の準備から手動でデプロイを行う手順までを解説します。自動化編はこちら

事前準備

以下の手順で作業を行います。

  1. デプロイするWebアプリケーションの作成
  2. AWS CDKのセットアップ
  3. AWS IAM(Identity and Access Management)の準備
  4. AWS CDKプロジェクトの作成

本コラムで使用した動作環境は以下の通りです。

$ node -v
v16.19.1
$ npm -v
8.19.3
$ cdk --version
1.122.0 (build ae09c16)
$ aws --version
aws-cli/1.25.89 Python/3.8.10 Linux/5.4.72-microsoft-standard-WSL2 botocore/1.27.88

1.デプロイするWebアプリケーションの作成

AWSにデプロイするアプリケーションを作成します。今回はユーザーインターフェィス構築のための JavaScript ライブラリであるReactというフレームワークを利用して、お手軽にWebアプリケーションを準備します。アプリケーションはmy-appディレクトリに作成します。

$ npx create-react-app my-app --template typescript

Need to install the following packages:
  create-react-app@5.0.1
Ok to proceed? (y) y
npm WARN deprecated tar@2.2.2: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.

Creating a new React app in /home/mikmatsu/my-app.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template-typescript...


added 1416 packages in 51s

231 packages are looking for funding
  run `npm fund` for details

Initialized a git repository.

Installing template dependencies using npm...

added 40 packages, and changed 1 package in 9s

231 packages are looking for funding
  run `npm fund` for details

We detected TypeScript in your project (src/App.test.tsx) and created a tsconfig.json file for you.

Your tsconfig.json has been populated with default values.

Removing template package using npm...


removed 1 package, and audited 1456 packages in 2s

231 packages are looking for funding
  run `npm fund` for details

6 high severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

Created git commit.

Success! Created my-app at /home/mikmatsu/my-app
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm run build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm run eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd my-app
  npm start

Happy hacking!
npm notice
npm notice New patch version of npm available! 9.5.0 -> 9.5.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.5.1
npm notice Run npm install -g npm@9.5.1 to update!
npm notice

作成したアプリケーションをローカル環境で起動させて、問題なく動作するか確認します。

$ cd my-app
$ npm start

Compiled successfully!

You can now view my-app in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://172.22.201.197:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

webpack compiled successfully
No issues found.

npm startコマンドを実行すると、自動的にブラウザが起動してhttp://localhost:3000/にアクセスし、以下のような画面が表示されます。

このWebアプリケーションをAWS環境へデプロイするためにビルド(静的ファイルにバンドル)しておきます。

$ npm run build

> my-app@0.1.0 build
> react-scripts build

Creating an optimized production build...
Compiled successfully.

File sizes after gzip:

  46.62 kB  build/static/js/main.64df0c98.js
  1.78 kB   build/static/js/787.28cb0dcd.chunk.js
  541 B     build/static/css/main.073c9b0a.css

The project was built assuming it is hosted at /.
You can control this with the homepage field in your package.json.

The build folder is ready to be deployed.
You may serve it with a static server:

  npm install -g serve
  serve -s build

Find out more about deployment here:

  https://cra.link/deployment

これでWebアプリケーションの準備は完了です。

2.AWS CDKのセットアップ

AWS CDKを使用してデプロイするため、まずはAWS CDKをAWS環境で利用するための準備を行います。
注意: AWS CDKのセットアップには、AdministratorAccess相当の権限が必要です。権限を持つユーザーでマネジメントコンソールにログインし、AWS CloudShellで実行します。

AWS CDKの初回セットアップ(ブートストラップ実行)

ブートストラップとは、AWS特定の環境 (アカウントとリージョン))にAWS CloudFormationのテンプレートをデプロイすることを指します。 AWSより提供されているAWS CDK向けの初回セットアップ用ブートストラップを活用します。ブートストラップを実行する前に、まずはディレクトリを作成し、AWS CDKを初期化します。

$ mkdir cdk
$ cd cdk/
$ npx -y cdk init --language typescript
Applying project template app for typescript
# Welcome to your CDK TypeScript project

This is a blank project for CDK development with TypeScript.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

* `npm run build`   compile typescript to js
* `npm run watch`   watch for changes and compile
* `npm run test`    perform the jest unit tests
* `cdk deploy`      deploy this stack to your default AWS account/region
* `cdk diff`        compare deployed stack with current state
* `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
✅ All done!
****************************************************
*** Newer version of CDK is available [2.66.0]   ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************

AWS CDKのブートストラップを実行します。

$ npx cdk bootstrap
 ⏳  Bootstrapping environment aws://{aws_account_id}/ap-northeast-1...
Trusted accounts for deployment: (none)
Trusted accounts for lookup: (none)
Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.
Switching from  to undefined as permissions boundary
CDKToolkit: creating CloudFormation changeset...
 ✅  Environment aws://{aws_account_id}/ap-northeast-1 bootstrapped.

AWS CDKのブートストラップを実行すると、CDKToolkitというAWS CloudFormationのスタックが作成され、AWS CDKを実行するために必要な11個のリソースができます。
以下はAWS コマンドラインインターフェイス(AWS CLI)で論理ID、物理ID、リソースタイプを取得しています。

$ aws cloudformation describe-stack-resources --stack-name CDKToolkit | jq -r '.StackResources[]| [.LogicalResourceId, .PhysicalResourceId, .ResourceType] | @tsv'
CdkBootstrapVersion     /cdk-bootstrap/hnb659fds/version        AWS::SSM::Parameter
CloudFormationExecutionRole     cdk-hnb659fds-cfn-exec-role-{aws_account_id}-ap-northeast-1 AWS::IAM::Role
ContainerAssetsRepository       cdk-hnb659fds-container-assets-{aws_account_id}-ap-northeast-1      AWS::ECR::Repository
DeploymentActionRole    cdk-hnb659fds-deploy-role-{aws_account_id}-ap-northeast-1   AWS::IAM::Role
FilePublishingRole      cdk-hnb659fds-file-publishing-role-{aws_account_id}-ap-northeast-1  AWS::IAM::Role
FilePublishingRoleDefaultPolicy CDKTo-File-19ZSO9QOT0RZ9        AWS::IAM::Policy
ImagePublishingRole     cdk-hnb659fds-image-publishing-role-{aws_account_id}-ap-northeast-1 AWS::IAM::Role
ImagePublishingRoleDefaultPolicy        CDKTo-Imag-1JHICXM6MD5ZQ        AWS::IAM::Policy
LookupRole      cdk-hnb659fds-lookup-role-{aws_account_id}-ap-northeast-1   AWS::IAM::Role
StagingBucket   cdk-hnb659fds-assets-{aws_account_id}-ap-northeast-1        AWS::S3::Bucket
StagingBucketPolicy     CDKToolkit-StagingBucketPolicy-QYDTUAMJZGQW     AWS::S3::BucketPolicy

論理ID物理IDリソースタイプ
CdkBootstrapVersion/cdk-bootstrap/hnb659fds/versionAWS::SSM::Parameter
CloudFormationExecutionRolecdk-hnb659fds-cfn-exec-role-{aws_account_id}-ap-northeast-1AWS::IAM::Role
ContainerAssetsRepositorycdk-hnb659fds-container-assets-{aws_account_id}-ap-northeast-1AWS::ECR::Repository
DeploymentActionRolecdk-hnb659fds-deploy-role-{aws_account_id}-ap-northeast-1AWS::IAM::Role
FilePublishingRolecdk-hnb659fds-file-publishing-role-{aws_account_id}-ap-northeast-1AWS::IAM::Role
FilePublishingRoleDefaultPolicyCDKTo-File-19ZSO9QOT0RZ9AWS::IAM::Policy
ImagePublishingRolecdk-hnb659fds-image-publishing-role-{aws_account_id}-ap-northeast-1AWS::IAM::Role
ImagePublishingRoleDefaultPolicyCDKTo-Imag-1JHICXM6MD5ZQAWS::IAM::Policy
LookupRolecdk-hnb659fds-lookup-role-{aws_account_id}-ap-northeast-1AWS::IAM::Role
StagingBucketcdk-hnb659fds-assets-{aws_account_id}-ap-northeast-1AWS::S3::Bucket
StagingBucketPolicyCDKToolkit-StagingBucketPolicy-QYDTUAMJZGQWAWS::S3::BucketPolicy

作成されるIAMロールは、それぞれ以下の用途で使用されます。

  • CloudFormationExecutionRole: AWS CDKのデプロイを行うAWS CloudFormationに渡されるロール。
  • DeploymentActionRole: デプロイに使用するロール。AWS CloudFormationを実行する権限などが付与されている。
  • FilePublishingRole: Amazon S3バケットにファイルを公開するためのロール。Amazon S3へのアクセス権限が付与されている。
  • ImagePublishingRole: コンテナイメージを公開するためのロール。Amazon ECRへのアクセス権限が付与されている。
  • LookupRole: AWS CDKのデプロイ時に既存リソースの情報を取得するために使用するロール。リードオンリーアクセス権限が付与されている。

3.AWS IAM(Identity and Access Management)の準備

ローカル環境のIAMユーザーを使用してAWSへデプロイを行うため、ローカル環境向けのIAMユーザーを作成します。 ベストプラクティスに従い、IAMユーザーへはブートストラップで作成されたIAMロールにスイッチロールする権限のみを付与することにします。これによりIAMユーザーに付与する権限を最小限に抑えることができます。また、今回はAWS CDKだけでなく、AWS CloudFormationによるリソース作成も一部含まれているため、そちらも行えるように設定します。

参考:20190130 AWS Black Belt Online Seminar AWS Identity and Access Management (AWS IAM) Part2

以下の作業をAWS CloudShellで実行します。

  • スイッチロールのみが可能なポリシードキュメントを作成

以下のJSONファイルを作成します。ブートストラップで作成されたIAMロール(先頭がcdkの名前で始まるロール群)にスイッチロールする権限のみを付与するような内容が含まれています。

 	{ 
    "Version": "2012-10-17", 
    "Statement": [
        { 
            "Effect": "Allow", 
            "Action": [
                "sts:AssumeRole" 
                ], 
            "Resource": [ 
                "arn:aws:iam::*:role/cdk-*",
                "arn:aws:iam::*:role/deploy-user-costom-role"
            ] 
        } 
    ] 
}

参考:
https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites

  • IAMポリシーを作成
$ aws iam create-policy \ 
    --policy-name deploy_policy \ 
    --policy-document file://deploy_policy.json
{
    "Policy": {
        "PolicyName": "deploy_policy",
        "PolicyId": "ANPAQCFYCUBCLXFYTWUGA",
        "Arn": "arn:aws:iam::{aws_account_id}:policy/deploy_policy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2023-MM-DDThh:mm:ssZ",
        "UpdateDate": "2023-MM-DDThh:mm:ssZ"
    }
}

  • IAMユーザーを作成
$ aws iam create-user \  
    --user-name deploy_user
{
    "User": {
        "Path": "/",
        "UserName": "deploy_user",
        "UserId": "AIDAQCFYCUBCATWXYZVHQ",
        "Arn": "arn:aws:iam::{aws_account_id}:user/deploy_user",
        "CreateDate": "2023-MM-DDThh:mm:ss+00:00"
    }
}

  • IAMユーザーに権限を付与
$ aws iam attach-user-policy \  
    --user-name deploy_user \  
    --policy-arn arn:aws:iam::{aws_account_id}:policy/deploy_policy

  • スイッチロールを許可するロールポリシードキュメントを作成(AWS CloudFormation実行用)

以下のJSONファイルを作成します。

 	{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{aws_account_id}:user/deploy_user"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

参考:IAM ロール (AWS CLI) の切り替え

  • IAMロールを作成(AWS CloudFormation実行用)
$ aws iam create-role \  
  --role-name deploy-user-costom-role \  
  --assume-role-policy-document file://deploy-user-costom-role.json
{
    "Role": {
        "Path": "/",
        "RoleName": "deploy-user-costom-role",
        "RoleId": "AROAQCFYCUBCJZQPIIBHG",
        "Arn": "arn:aws:iam::{aws_account_id}:role/deploy-user-costom-role",
        "CreateDate": "2023-02-24T08:54:48+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::{aws_account_id}:user/deploy_user"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}

  • IAMロールに必要な権限を付与
$ aws iam attach-role-policy \  
  --role-name deploy-user-costom-role \  
  --policy-arn arn:aws:iam::aws:policy/IAMFullAccess
$ aws iam attach-role-policy \  
  --role-name deploy-user-costom-role \  
  --policy-arn arn:aws:iam::aws:policy/AWSCloudFormationFullAccess

権限が付与できたら、ローカル環境で使用するためのアクセスキーを発行します。

  • IAMユーザーのアクセスキーを作成
$ aws iam create-access-key \  
--user-name deploy_user
{
    "AccessKey": {
        "UserName": "deploy_user",
        "AccessKeyId": "AKXXXXXXXXXXXXXXXXXX",
        "Status": "Active",
        "SecretAccessKey": "SAKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "CreateDate": "2023-MM-DDThh:mm:ss+00:00"
    }
}

AWS CloudShellでの作業は一旦ここまでです。

次はローカル環境で以下の作業を実行します。作成したアクセスキーを、aws configureを使用してローカル環境に設定します。

$ aws configure --profile deploy_user
AWS Access Key ID [None]: AKXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: SAKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

AWS CLIのスイッチロール用に、~/.aws/configに以下の内容を追加します。
※ここで定義するプロファイル名“deploy_role”は、自動化編 OIDCプロバイダーとIAMロールを作成で使用します。

[profile deploy_role]
role_arn = arn:aws:iam::{aws_account_id}:role/deploy-user-costom-role
source_profile = deploy_user

4.AWS CDKプロジェクトの作成

注意: この章からはローカル環境で実行します。


AWS CDKプロジェクトを作成します。 Webアプリケーションを作成したmy-appディレクトリ内で実行します。

$ npx -y cdk init --language typescript
Applying project template app for typescript
# Welcome to your CDK TypeScript project

This is a blank project for CDK development with TypeScript.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

* `npm run build`   compile typescript to js
* `npm run watch`   watch for changes and compile
* `npm run test`    perform the jest unit tests
* `cdk deploy`      deploy this stack to your default AWS account/region
* `cdk diff`        compare deployed stack with current state
* `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
✅ All done!

AWS CDKのコーディング

AWS CDKを利用してAWSの環境(Amazon S3とAmazon CloudFront)を構築し、Webサイトを公開します。 まずは、cdk/lib/cdk-stack.tsにコーディングを行います。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucket = new cdk.aws_s3.Bucket(this, 'bucket')
    const distribution = new cdk.aws_cloudfront.Distribution(this, 'distribution', {
      defaultBehavior: {
        origin: new cdk.aws_cloudfront_origins.S3Origin(bucket)
      }, defaultRootObject: 'index.html'
    })

    new cdk.aws_s3_deployment.BucketDeployment(this, 'deploy', {
      sources: [cdk.aws_s3_deployment.Source.asset('../build')],
      destinationBucket: bucket,
      distribution: distribution,
      distributionPaths: ['/']
    })

    new cdk.CfnOutput(this, 'bucket_bucketName', {
      value: bucket.bucketName
    })
    new cdk.CfnOutput(this, 'distribution_domainName', {
      value: distribution.domainName
    })
  }
}

ローカル環境からデプロイ

Webサイトをローカル環境からAWSへデプロイします。

$ npx cdk deploy --profile deploy_user

✨  Synthesis time: 3.95s

CdkStack: building assets...

[0%] start: Building c9455aefa243f3cd7a810b3f6df8ed37e457d3e1d046353da27c4aa13551d4dc:current_account-current_region
[0%] start: Building 2bc265c5e0569aeb24a6349c15bd54e76e845892376515e036627ab0cc70bb64:current_account-current_region
[0%] start: Building 9cfc230c97a272787b94b77378cfd0c3b0881262116f6fe906f85147f3896c06:current_account-current_region
[0%] start: Building adb2a8b2535bde64c49ccd08e410406757de1acf50f0e7510a3459b70c4b2281:current_account-current_region
[25%] success: Built c9455aefa243f3cd7a810b3f6df8ed37e457d3e1d046353da27c4aa13551d4dc:current_account-current_region
[50%] success: Built 2bc265c5e0569aeb24a6349c15bd54e76e845892376515e036627ab0cc70bb64:current_account-current_region
[75%] success: Built 9cfc230c97a272787b94b77378cfd0c3b0881262116f6fe906f85147f3896c06:current_account-current_region
[100%] success: Built adb2a8b2535bde64c49ccd08e410406757de1acf50f0e7510a3459b70c4b2281:current_account-current_region

CdkStack: assets built

This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:

IAM Statement Changes
┌───┬──────────────────────────────┬────────┬──────────────────────────────┬──────────────────────────────┬───────────┐
│   │ Resource                     │ Effect │ Action                       │ Principal                    │ Condition │
├───┼──────────────────────────────┼────────┼──────────────────────────────┼──────────────────────────────┼───────────┤
│ + │ ${Custom::CDKBucketDeploymen │ Allow  │ sts:AssumeRole               │ Service:lambda.amazonaws.com │           │
│   │ t8693BB64968944B69AAFB0CC9EB │        │                              │                              │           │
│   │ 8756C/ServiceRole.Arn}       │        │                              │                              │           │
├───┼──────────────────────────────┼────────┼──────────────────────────────┼──────────────────────────────┼───────────┤
│ + │ ${bucket.Arn}                │ Allow  │ s3:Abort*                    │ AWS:${Custom::CDKBucketDeplo │           │
│   │ ${bucket.Arn}/*              │        │ s3:DeleteObject*             │ yment8693BB64968944B69AAFB0C │           │
│   │                              │        │ s3:GetBucket*                │ C9EB8756C/ServiceRole}       │           │
│   │                              │        │ s3:GetObject*                │                              │           │
│   │                              │        │ s3:List*                     │                              │           │
│   │                              │        │ s3:PutObject                 │                              │           │
│   │                              │        │ s3:PutObjectLegalHold        │                              │           │
│   │                              │        │ s3:PutObjectRetention        │                              │           │
│   │                              │        │ s3:PutObjectTagging          │                              │           │
│   │                              │        │ s3:PutObjectVersionTagging   │                              │           │
├───┼──────────────────────────────┼────────┼──────────────────────────────┼──────────────────────────────┼───────────┤
│ + │ ${bucket.Arn}/*              │ Allow  │ s3:GetObject                 │ CanonicalUser:${distribution │           │
│   │                              │        │                              │ /Origin1/S3Origin.S3Canonica │           │
│   │                              │        │                              │ lUserId}                     │           │
├───┼──────────────────────────────┼────────┼──────────────────────────────┼──────────────────────────────┼───────────┤
│ + │ *                            │ Allow  │ cloudfront:CreateInvalidatio │ AWS:${Custom::CDKBucketDeplo │           │
│   │                              │        │ n                            │ yment8693BB64968944B69AAFB0C │           │
│   │                              │        │ cloudfront:GetInvalidation   │ C9EB8756C/ServiceRole}       │           │
├───┼──────────────────────────────┼────────┼──────────────────────────────┼──────────────────────────────┼───────────┤
│ + │ arn:${AWS::Partition}:s3:::{ │ Allow  │ s3:GetBucket*                │ AWS:${Custom::CDKBucketDeplo │           │
│   │ "Fn::Sub":"cdk-hnb659fds-ass │        │ s3:GetObject*                │ yment8693BB64968944B69AAFB0C │           │
│   │ ets-${AWS::AccountId}-${AWS: │        │ s3:List*                     │ C9EB8756C/ServiceRole}       │           │
│   │ :Region}"}                   │        │                              │                              │           │
│   │ arn:${AWS::Partition}:s3:::{ │        │                              │                              │           │
│   │ "Fn::Sub":"cdk-hnb659fds-ass │        │                              │                              │           │
│   │ ets-${AWS::AccountId}-${AWS: │        │                              │                              │           │
│   │ :Region}"}/*                 │        │                              │                              │           │
└───┴──────────────────────────────┴────────┴──────────────────────────────┴──────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────┐
│   │ Resource                                               │ Managed Policy ARN                                     │
├───┼────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────┤
│ + │ ${Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9 │ arn:${AWS::Partition}:iam::aws:policy/service-role/AWS │
│   │ EB8756C/ServiceRole}                                   │ LambdaBasicExecutionRole                               │
└───┴────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Do you wish to deploy these changes (y/n)? y
CdkStack: deploying... [1/1]
[0%] start: Publishing c9455aefa243f3cd7a810b3f6df8ed37e457d3e1d046353da27c4aa13551d4dc:current_account-current_region
[0%] start: Publishing 2bc265c5e0569aeb24a6349c15bd54e76e845892376515e036627ab0cc70bb64:current_account-current_region
[0%] start: Publishing 9cfc230c97a272787b94b77378cfd0c3b0881262116f6fe906f85147f3896c06:current_account-current_region
[0%] start: Publishing adb2a8b2535bde64c49ccd08e410406757de1acf50f0e7510a3459b70c4b2281:current_account-current_region
[25%] success: Published 2bc265c5e0569aeb24a6349c15bd54e76e845892376515e036627ab0cc70bb64:current_account-current_region
[50%] success: Published adb2a8b2535bde64c49ccd08e410406757de1acf50f0e7510a3459b70c4b2281:current_account-current_region
[75%] success: Published 9cfc230c97a272787b94b77378cfd0c3b0881262116f6fe906f85147f3896c06:current_account-current_region
[100%] success: Published c9455aefa243f3cd7a810b3f6df8ed37e457d3e1d046353da27c4aa13551d4dc:current_account-current_region
CdkStack: creating CloudFormation changeset...

 ✅  CdkStack

✨  Deployment time: 772.57s

Outputs:
CdkStack.bucketbucketName = cdkstack-bucket43879c71-4z3237jd6po5
CdkStack.distributiondomainName = d1clpkp255qtzc.cloudfront.net
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:{aws_account_id}:stack/CdkStack/12e3ffe0-b40d-11ed-8a66-0656cf12c26d

✨  Total time: 776.51s

Outputsに出力されるCdkStack.distributiondDomainNameにプラウザからアクセスするとReactの初期画面が表示されます。

無事にローカル環境からデプロイが成功しました。

手動でデプロイを行う環境の準備が整いました。手動でのデプロイでは、手順のミスやデプロイ作業が属人化してしまう懸念がありますので、富士ソフトでは、開発が進んでからではなく、プロジェクトが開始した直後に自動化を導入することを推奨しています。
自動化編ではGitHub Actionsを使用したデプロイの自動化を実現する手順を解説します。

富士ソフトのAWS関連サービスについて、詳しくはこちら
アマゾンウェブサービス(AWS)

富士ソフトのIoT プラットフォーム on AWSはこちら
IoTプラットフォーム on AWS

 

 

この記事の執筆者

松井 美佳Mika Matsui

エリア事業本部
西日本支社 インテグレーション&ソリューション部
第1技術グループ
リーダー / エキスパート

AWS クラウド