継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

『AWS Copilot』で ECS の CI/CD パイプラインをサクッと作る

タダです.

AWS Copilot」のコマンドでcopilot pipelineからはじまるコマンドがあります.このコマンドでは,GitHub にコードをプッシュした時に CodeBuild,CodePipeline によるリリースパイプラインを作ることができます.この記事では,copilot pipelineコマンドを使ってパイプラインの作成とパイプラインでの ECS アプリケーションのデプロイをやってみます.なお,バージョンはv0.2.0で動作確認してます.

» copilot version
version: v0.2.0, built for darwin

パイプラインの構造

AWS Copilot」で作られるパイプラインの構造は3つあります.

  1. デフォルトですと, master ブランチへのプッシュをトリガーにして GitHub からソースコードを取得するステージ
  2. コンテナイメージがビルドされ,ECR リポジトリにイメージを格納するステージ
  3. ECR アプリケーションのデプロイステージ

パイプラインに関するドキュメント github.com

なお,GitHub と CodePipeline の連携は GitHub のアクセストークンを介して行います.発行していない場合は下記ドキュメントを参考にrepoおよびadmin:repo_hookの権限を与えてアクセストークンを準備しておいてください.

docs.aws.amazon.com

ローカルでのセットアップ

まずは,ローカルでパイプライン作成に必要なセットアップを行います.予めデプロイしたいサービスは準備しているディレクトリまで移動し,copilot pipeline initコマンドを実行します.いくつかの質問にウィザードに沿って回答します.この工程では①アプリケーションをデプロイするステージの指定,②CodePipeline と連携する GitHub リポジトリの指定,③GitHub のアクセストークンを Secret Manager へ保存,④パイプライン構成のための各種ファイル生成が行われています.

» copilot pipeline init                                          
Would you like to add an environment to your pipeline? Yes
Which environment would you like to add to your pipeline? test
Which GitHub repository would you like to use for your service? git@github.com:tasogare0919/copilot-sandbox
Please enter your GitHub Personal Access Token for your repository copilot-sandbox: 
✔ Created the secret github-token-sample-app-copilot-sandbox for pipeline source stage!
✔ Wrote the pipeline manifest for copilot-sandbox at 'copilot/pipeline.yml'
The manifest contains configurations for your CodePipeline resources, such as your pipeline stages and build steps.
✔ Wrote the buildspec for the pipeline's build stage at 'copilot/buildspec.yml'
The buildspec contains the commands to build and push your container images to your ECR repositories.

Recommended follow-up actions:
- Commit and push the generated buildspec and manifest file.
- Update the build phase of your buildspec to unit test your services before pushing the images.
- Update your pipeline manifest to add additional stages.
- Run `copilot pipeline update` to deploy your pipeline for the repository.

copilot pipeline initコマンド実行によりcopilotディレクトリ配下にbuildspec.ymlpipeline.ymlファイルが生成されます.

» tree                
.
├── copilot
│   ├── buildspec.yml
│   └── pipeline.yml

各ファイルの中身をみてみます.pipeline.ymlはパイプラインのためのマニフェストファイルです.マニフェストファイルでは大きく3つのセクションがあり,パイプライン名を指定している箇所・リピジトリに関する情報の箇所・デプロイステージの箇所です.ファイルの中身は変更できますが,更新する場合はcopilot pipeline updateを行います.

# This YAML file defines the relationship and deployment ordering of your environments.
# The name of the pipeline
name: pipeline-sample-app-tasogare0919-copilot-sandbox

# The version of the schema used in this template
version: 1

# This section defines the source artifacts.
source:
  # The name of the provider that is used to store the source artifacts.
  provider: GitHub
  # Additional properties that further specifies the exact location
  # the artifacts should be sourced from. For example, the GitHub provider
  # has the following properties: repository, branch.
  properties:
    access_token_secret: github-token-sample-app-copilot-sandbox
    branch: master
    repository: https://github.com/tasogare0919/copilot-sandbox

# The deployment section defines the order the pipeline will deploy
# to your environments.
stages:
    - # The name of the environment to deploy to.
      name: test
      # Optional: use test commands to validate this stage of your build.
      # test_commands: [echo 'running tests', make test]

buildspec.ymlは CodeBuild でのビルド実行に関する定義ファイルです.ECR へのコンテナイメージビルドと格納を行なっています.

# Buildspec runs in the build stage of your pipeline.
version: 0.2
phases:
  install:
    runtime-versions:
      docker: 18
      ruby: 2.6
    commands:
      - echo "cd into $CODEBUILD_SRC_DIR"
      - cd $CODEBUILD_SRC_DIR
      # Download the copilot linux binary.
      - wget https://ecs-cli-v2-release.s3.amazonaws.com/copilot-linux-v0.2.0
      - mv ./copilot-linux-v0.2.0 ./copilot-linux
      - chmod +x ./copilot-linux
  build:
    commands:
      - echo "Run your tests"
      # - make test
  post_build:
    commands:
      - ls -l
      - export COLOR="false"
      # Find all the local services in the workspace.
      - svcs=$(./copilot-linux svc ls --local --json | jq '.services[].name' | sed 's/"//g')
      # Find all the environments.
      - envs=$(./copilot-linux env ls --json | jq '.environments[].name' | sed 's/"//g')
      # Generate the cloudformation templates.
      # The tag is the build ID but we replaced the colon ':' with a dash '-'.
      - tag=$(sed 's/:/-/g' <<<"$CODEBUILD_BUILD_ID")
      - >
        for env in $envs; do
          for svc in $svcs; do
          ./copilot-linux svc package -n $svc -e $env --output-dir './infrastructure' --tag $tag;
          done;
        done;
      - ls -lah ./infrastructure
      # If addons exists, upload addons templates to each S3 bucket and write template URL to template config files.
      - |
        for svc in $svcs; do
          ADDONSFILE=./infrastructure/$svc.addons.stack.yml
          if [ -f "$ADDONSFILE" ]; then
            tmp=$(mktemp)
            timestamp=$(date +%s)
            aws s3 cp "$ADDONSFILE" "s3://xxxx/manual/$timestamp/$svc.addons.stack.yml";
            jq --arg a "https://xxxxs3-ap-northeast-1.amazonaws.com/manual/$timestamp/$svc.addons.stack.yml" '.Parameters.AddonsTemplateURL = $a' ./infrastructure/$svc-test.params.json > "$tmp" && mv "$tmp" ./infrastructure/$svc-test.params.json
          fi
        done;
      # Build images
      # - For each manifest file:
      #   - Read the path to the Dockerfile by translating the YAML file into JSON.
      #   - Run docker build.
      #   - For each environment:
      #     - Retrieve the ECR repository.
      #     - Login and push the image.
      - >
        for svc in $svcs; do
          for df_rel_path in $(cat $CODEBUILD_SRC_DIR/copilot/$svc/manifest.yml | ruby -ryaml -rjson -e 'puts JSON.pretty_generate(YAML.load(ARGF))' | jq '.image.build' | sed 's/"//g'); do
          df_path=$CODEBUILD_SRC_DIR/$df_rel_path
          df_dir_path=$(dirname "$df_path")
          docker build -t $svc:$tag -f $df_path $df_dir_path;
          image_id=$(docker images -q $svc:$tag);
            for env in $envs; do
            repo=$(cat $CODEBUILD_SRC_DIR/infrastructure/$svc-$env.params.json | jq '.Parameters.ContainerImage' | sed 's/"//g');
            region=$(echo $repo | cut -d'.' -f4);
            $(aws ecr get-login --no-include-email --region $region);
            docker tag $image_id $repo;
            docker push $repo;
            done;
          done;
        done;
artifacts:
  files:
    - "infrastructure/*"

ローカルでのセットアップが完了なので次はパイプラインの作成に移るのですが,予めこれらのファイルを GitHub リポジトリにを上げておきます.

AWS 環境にパイプラインの作成及び実行

パイプラインの作成及び更新にはcopilot pipeline updateで行います.コマンド実行後,CloudFormation スタックが作成されて CodePipeline と CodeBuild が作成されます.

» copilot pipeline update
✔ Successfully added pipeline resources to your application: sample-app
✔ Successfully created a new pipeline: pipeline-sample-app-tasogare0919-copilot-sandbox

f:id:sadayoshi_tada:20200807075903p:plain

スタックが作成された後に,パイプラインが動作します.僕はcopillot pipeline update実行前にコードを GitHub リポジトリにプッシュし忘れていたので一度処理が失敗しましたが,コードが上がっていればパイプラインは全ての処理をパスしました.

f:id:sadayoshi_tada:20200807080041p:plain

なお,AWS マネジメントコンソールでも確認する以外にもcopilot pipeline showcopilot pipeline statusでもパイプラインの実行状況を確認できます.

» copilot pipeline show  
About

  Name              pipeline-sample-app-tasogare0919-copilot-sandbox
  Region            ap-northeast-1
  AccountID         XXXXXXXXXXXX
  Created At        40 minutes ago
  Updated At        40 minutes ago

Stages

  Name              Category            Provider            Details
  ----              ----                ----                ----
  Source            Source              GitHub              Repository: tasogare0919/copilot-sandbox
  Build             Build               CodeBuild           BuildProject: pipeline-sample-app-tasogare0919-copilot-sandbox-BuildProject
  DeployTo-test     Deploy              CloudFormation      StackName: sample-app-test-front-end

» copilot pipeline status
Pipeline Status

Stage                              Transition          Status
-----                              ----------          ------
Source                             ENABLED             Succeeded
└── SourceCodeFor-sample-app                           Succeeded
Build                              ENABLED             Succeeded
└── Build                                              Succeeded
DeployTo-test                      ENABLED             Succeeded
└── CreateOrUpdate-front-end-test                      Succeeded

Last Deployment

  Updated At    38 minutes ago

自動テストステージの追加

パイプラインでは,デプロイした ECS アプリケーションに対してテストを入れていくことも考えられます.「AWS Copilot」でも自動テストのステージを追加できます.以下の定義では,make testコマンドを実行するだけのものですが,独自のテストコマンドを定義できます.この状態でcopilot pipeline updateを実行すると,テスト用の CodeBuild プロジェクトとデプロイパイプラインにテスト処理が追加されます.

# This YAML file defines the relationship and deployment ordering of your environments.

# The name of the pipeline
name: pipeline-sample-app-tasogare0919-copilot-sandbox

# The version of the schema used in this template
version: 1

# This section defines the source artifacts.
source:
  # The name of the provider that is used to store the source artifacts.
  provider: GitHub
  # Additional properties that further specifies the exact location
  # the artifacts should be sourced from. For example, the GitHub provider
  # has the following properties: repository, branch.
  properties:
    access_token_secret: github-token-sample-app-copilot-sandbox
    branch: master
    repository: https://github.com/tasogare0919/copilot-sandbox

# The deployment section defines the order the pipeline will deploy
# to your environments.
stages:
    - # The name of the environment to deploy to.
      name: test
      # Optional: use test commands to validate this stage of your build.
      test_commands: <= 更新
        - echo 'running tests' <= 更新
        - make test <= 更新
        - echo 'tests passed' <= 更新

AWS 環境のパイプラインを削除

作成したパイプラインの削除するにはcopilot pipeline deleteで行います.Secret Manager の情報も消えます.

» copilot pipeline delete
Are you sure you want to delete pipeline pipeline-sample-app-tasogare0919-copilot-sandbox from application sample-app? Yes
Are you sure you want to delete the source secret github-token-sample-app-copilot-sandbox associated with pipeline pipeline-sample-app-tasogare0919-copilot-sandbox? Yes
✔ Deleted secret github-token-sample-app-copilot-sandbox.
✔ Deleted pipeline pipeline-sample-app-tasogare0919-copilot-sandbox from application sample-app.

まとめ

AWS Copilot」での CI/CD パイプラインを行うコマンドとどのようにデプロイをしていくかを見てきました.ドキュメントにも記載があったのですが,リリースプロセスの構成をできるだけ簡単にしたいというメッセージの通りで体感としてもパイプラインの作成とデプロイがコマンド数回で実現できてしまうため簡単でした.リリースの戦略や方針にもよると思いますが,気になる方は試しに使ってみて検討してみてほしいです!

関連記事

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

『AWS Coplilot CLI』の v0.2.0 でサポートされたストレージリソースのデプロイを実践する

タダです.

AWS Coplilot CLI」がv0.2.0になった時に追加されたcopilot storage initコマンドがあります.このコマンドで S3 もしくは DynamoDB を ECS のアプリケーションと関連づけられ,デプロイする時も一緒に展開されます.今回はストレージリソースを追加するコマンドでどんなことができるのかを観つつ,実際に AWS 上にリソースを作成してみます.

github.com

copilot storage init でリソースを足してみる

copilot storage initで S3 と DynamoDB をリソースを足してデプロイして動作を確認してみます.

S3 をストレージリソースに指定する場合

copilot storage initcopilot-sandbox-bucketという S3 バケットを作り,front-endというサービスに関連づけるようにコマンドを実行しました.すると,front-endサービスのディレクトリ配下にaddonsディレクトリが追加されました.

» copilot storage init -n copilot-sandbox-bucket -t S3 -s front-end
✔ Wrote CloudFormation template for S3 Bucket copilot-sandbox-bucket at front-end/addons/copilot-sandbox-bucket.yml
The Cloudformation template is a nested stack which fully describes your resource,
the IAM policy necessary for an ECS task to access that resource, and outputs
which are injected as environment variables into the Copilot service this addon is associated with.

Recommended follow-up actions:
- Update your service code to leverage the injected environment variable `COPILOTSANDBOXBUCKET_NAME`
- Run `copilot svc deploy --name front-end` to deploy your storage resources to your environments.

ツリーで出すと以下のディレクトリ構造です.

» tree                                
.
└── front-end
    ├── addons
    │   └── copilot-sandbox-bucket.yml
    └── manifest.yml

2 directories, 2 files

addons ディレクトリにできた CloudFormation の中身

addonsの中にできた CloudFormation テンプレートもみてみましょう.S3 とバケットポリシー と IAM ポリシーが作られるようになっています.S3 バケット名はアプリケーション名-環境名-サービス名-copilot-sandbox-bucketに作られるよう定義されているので,今回はアプリケーション名をs3-test-app.サービス名をfront-end,環境名はtestにしているので,s3-test-app-test-front-end-copilot-sandbox-bucketというバケットが作られるはずです.

Parameters:
  App:
    Type: String
    Description: Your application's name.
  Env:
    Type: String
    Description: The environment name your service, job, or workflow is being deployed to.
  Name:
    Type: String
    Description: The name of the service, job, or workflow being deployed.
Resources:
  copilotsandboxbucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      AccessControl: Private
      BucketEncryption:
        ServerSideEncryptionConfiguration:
        - ServerSideEncryptionByDefault:
            SSEAlgorithm: AES256
      BucketName: !Sub '${App}-${Env}-${Name}-copilot-sandbox-bucket'
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true

  copilotsandboxbucketBucketPolicy:
    Type: AWS::S3::BucketPolicy
    DeletionPolicy: Retain
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: ForceHTTPS
            Effect: Deny
            Principal: '*'
            Action: 's3:*'
            Resource: 
              - !Sub ${ copilotsandboxbucket.Arn}/*
              - !Sub ${ copilotsandboxbucket.Arn}
            Condition: 
              Bool:
                "aws:SecureTransport": false
      Bucket: !Ref copilotsandboxbucket

  copilotsandboxbucketAccessPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      Description: !Sub
        - Grants CRUD access to the S3 bucket ${Bucket}
        - { Bucket: !Ref copilotsandboxbucket }
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: S3ObjectActions
            Effect: Allow
            Action:
              - s3:GetObject
              - s3:PutObject
              - s3:PutObjectACL
              - s3:PutObjectTagging
              - s3:DeleteObject
              - s3:RestoreObject
            Resource: !Sub ${ copilotsandboxbucket.Arn}/*
          - Sid: S3ListAction
            Effect: Allow
            Action: s3:ListBucket
            Resource: !Sub ${ copilotsandboxbucket.Arn}

Outputs:
  copilotsandboxbucketName:
    Description: "The name of a user-defined bucket."
    Value: !Ref copilotsandboxbucket
  copilotsandboxbucketAccessPolicy:
    Description: "The IAM::ManagedPolicy to attach to the task role"
    Value: !Ref copilotsandboxbucketAccessPolicy

デプロイの実践

ECS と一緒に S3 が作成されるかを見るために試しにデプロイします.front-endサービスでtestステージとしてデプロイします.

» copilot svc deploy -n front-end -e test
Sending build context to Docker daemon  97.28kB
Step 1/3 : FROM nginx
 ---> 2622e6cca7eb
Step 2/3 : EXPOSE 80
 ---> Using cache
 ---> 26762c0d19ed
Step 3/3 : COPY index.html /usr/share/nginx/html
 ---> Using cache
 ---> 418ae089702d
Successfully built 418ae089702d
Successfully tagged XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/s3-test-app/front-end:594bd85
Login Succeeded
The push refers to repository [XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/s3-test-app/front-end]
f2ed02c7c10a: Pushed 
f978b9ed3f26: Pushed 
9040af41bb66: Pushed 
7c7d7f446182: Pushed 
d4cf327d8ef5: Pushed 
13cb14c2acd3: Pushed 
594bd85: digest: sha256:234bf1c50d5b5b0f27abaec5be3e2b33cf1f81f0caa3f3a5c015cb0610e79004 size: 1570


✔ Deployed front-end, you can access it at http://s3-te-Publi-1LSK6S09DLXSM-500018808.ap-northeast-1.elb.amazonaws.com.

ECS クラスターと一緒にs3-test-app-test-front-end-copilot-sandbox-bucketが作成されていました. f:id:sadayoshi_tada:20200803131803p:plain f:id:sadayoshi_tada:20200803131813p:plain

削除する時の注意点として S3 バケットは削除されません.CloudFormation テンプレート(本記事でいう copilot-sandbox-bucket.yml )で DeletionPolicy: Retain が定義されているためです.開発中に何度も作って潰してを繰り返すこともあると思うのでその時はDeletionPolicy:Deleteを設定することを検討しましょう. docs.aws.amazon.com

DynamoDB をストレージリソースに指定する場合

copilot storage initcopilot-sandbox-tableという DynamoDB のテーブルを作り,Email というパーティションキーと UserId というソートキーを設定して,front-endというサービスに関連づけるようにコマンドを実行しました.S3 の時と同様に,front-endサービスのディレクトリ配下にaddonsディレクトリが追加されました.

 » copilot storage init -n copilot-sandbox-table -t DynamoDB -s front-end --partition-key Email:S --sort-key UserId:N --no-lsi
✔ Wrote CloudFormation template for DynamoDB Table copilot-sandbox-table at copilot/front-end/addons/copilot-sandbox-table.yml
The Cloudformation template is a nested stack which fully describes your resource,
the IAM policy necessary for an ECS task to access that resource, and outputs
which are injected as environment variables into the Copilot service this addon
is associated with.

Recommended follow-up actions:
- Update your service code to leverage the injected environment variable `COPILOTSANDBOXTABLE_NAME`
- Run `copilot svc deploy --name front-end` to deploy your storage resources to your environments.

ツリーで出すと以下のディレクトリ構造です.

» tree                                
.
└── front-end
    ├── addons
    │   └── copilot-sandbox-table.yml
    └── manifest.yml

2 directories, 2 files

addons ディレクトリにできた CloudFormation の中身

addonsの中にできた CloudFormation テンプレートもみてみましょう.ざっとみると,DynamoDB と IAM ポリシーが作られるようになっています.DynamoDB のテーブル名はアプリケーション名-環境名-サービス名-copilot-sandbox-tableに作られるよう定義されているので,今回はアプリケーション名をdynamo-test-app.サービス名をfront-end,環境名はtestにしているので,dynamo-test-app-test-front-end-copilot-sandbox-bucketというバケットが作られるはずです.

Parameters:
  App:
    Type: String
    Description: Your application's name.
  Env:
    Type: String
    Description: The environment name your service, job, or workflow is being deployed to.
  Name:
    Type: String
    Description: The name of the service, job, or workflow being deployed.
Resources:
  copilotsandboxtable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: !Sub ${App}-${Env}-${Name}-copilot-sandbox-table
      AttributeDefinitions:
        - AttributeName: Email
          AttributeType: "S"
        - AttributeName: UserId
          AttributeType: "N"
      BillingMode: PAY_PER_REQUEST
      KeySchema:
        - AttributeName: Email
          KeyType: HASH
        - AttributeName: UserId
          KeyType: RANGE

  copilotsandboxtableAccessPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      Description: !Sub
        - Grants CRUD access to the Dynamo DB table ${Table}
        - { Table: !Ref copilotsandboxtable }
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: DDBActions
            Effect: Allow
            Action:
              - dynamodb:BatchGet*
              - dynamodb:DescribeStream
              - dynamodb:DescribeTable
              - dynamodb:Get*
              - dynamodb:Query
              - dynamodb:Scan
              - dynamodb:BatchWrite*
              - dynamodb:Create*
              - dynamodb:Delete*
              - dynamodb:Update*
              - dynamodb:PutItem
            Resource: !Sub ${ copilotsandboxtable.Arn}
          - Sid: DDBLSIActions
            Action:
              - dynamodb:Query
              - dynamodb:Scan
            Effect: Allow
            Resource: !Sub ${ copilotsandboxtable.Arn}/Index/*

Outputs:
  copilotsandboxtableName:
    Description: "The name of this DynamoDB."
    Value: !Ref copilotsandboxtable
  copilotsandboxtableAccessPolicy:
    Description: "The IAM::ManagedPolicy to attach to the task role."
    Value: !Ref copilotsandboxtableAccessPolicy

デプロイの実践

DynamoDB のリソースが作られるかを確認するためにデプロイします.front-endサービスでtestステージとしてデプロイします.

» copilot svc deploy -n front-end -e test
Sending build context to Docker daemon  97.28kB
Step 1/3 : FROM nginx
 ---> 2622e6cca7eb
Step 2/3 : EXPOSE 80
 ---> Using cache
 ---> 26762c0d19ed
Step 3/3 : COPY index.html /usr/share/nginx/html
 ---> Using cache
 ---> 418ae089702d
Successfully built 418ae089702d
Successfully tagged XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/dynamo-test-app/front-end:594bd85
Login Succeeded
The push refers to repository [XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/dynamo-test-app/front-end]
f2ed02c7c10a: Pushed 
f978b9ed3f26: Pushed 
9040af41bb66: Pushed 
7c7d7f446182: Pushed 
d4cf327d8ef5: Pushed 
13cb14c2acd3: Pushed 
594bd85: digest: sha256:234bf1c50d5b5b0f27abaec5be3e2b33cf1f81f0caa3f3a5c015cb0610e79004 size: 1570


✔ Deployed front-end, you can access it at http://dynam-Publi-1J6Y56CHUQZF1-2062355131.ap-northeast-1.elb.amazonaws.com.

ECS クラスターと一緒にdynamo-test-app-test-front-end-copilot-sandbox-tableが作成されていました. f:id:sadayoshi_tada:20200803120639p:plain f:id:sadayoshi_tada:20200803121612p:plain

まとめ

ver0.2.0で追加されたcopilot storage initコマンドでできることと実際にリソースの作成を試してみました.サービスで指定した ECS リソース以外にも S3 や DynamoDB を利用したアーキテクチャを採用したい時にこのコマンドが役立つと思います.次はcopilot pipeline のコマンドについて記事を書きたいと思います.

関連記事

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

『AWS Copilot CLI』のコマンドとパラメーターから『AWS Coplilot』の理解を深める

タダです.

AWS Copilot CLI」のコマンドとそのパラメーターでまだまだ知らないことが多いのでこの記事でコマンドとパラメーターを確認して,「AWS Copilot」の理解を深めたいと思います.

参照したドキュメント github.com

なお,CLI のバージョンは 0.2.0 で確認しております.

 » copilot version
version: v0.2.0, built for darwin

AWS Copilot CLI のコマンドの種類

AWS Copilot CLI」が使えるコマンドとして次のものがあり,copilot helpを叩くとコマンドを確認できます.それぞれのコマンドとオプションをhelpを叩いて行くことでさらに詳細を確認できますので見ていきます.

  • init
  • app
  • env
  • svc
  • pipeline
  • deploy
  • storage
  • version
  • completion
  • docs
» copilot help
👩<200d>✈️ Launch and manage applications on Amazon ECS and AWS Fargate.

Commands
  Getting Started 🌱
    init        Create a new ECS application.
    docs        Open the copilot docs.

  Develop ✨
    app         Commands for applications.
                Applications are a collection of services and environments.

    env         Commands for environments.
                Environments are deployment stages shared between services.

    svc         Commands for services.
                Services are long-running Amazon ECS services.

  Release 🚀
    pipeline    Commands for pipelines.
                Continuous delivery pipelines to release services.

    deploy      Deploy your service.

  Addons 🧸
    storage     Commands for working with storage and databases.

  Settings ⚙️
    version     Print the version number.
    completion  Output shell completion code.

Flags
  -h, --help   help for copilot

Examples
  Displays the help menu for the "init" command.
  `$ copilot init --help`

copilot init

copilot initコマンドは新しい ECS で動作するアプリケーションを作るためのコマンドです.各パラメーターを見ていきます.

パラメーター 用途
-a, --app string アプリケーション名を指定する時に使う
--deploy テスト環境にデプロイするために指定する時に使う
-d, --dockerfile string Dockerfile へのパスを指定する時に使う
--port uint16 ポート指定する場合に使う
--profile string AWS CLI で設定済みのプロファイル指定したい時に使う
-s, --svc string サービズ名を指定する時に使う
-t, --svc-type string サービスタイプを指定する時に使う
Load Balanced Web ServiceBackend Serviceを指定する
--tag string サービスのコンテナイメージにタグを付与するために使う
-h, --help ヘルプ情報を出したい時に使う

copilot app

copilot appコマンドはアプリケーションを作ったり,情報を参照するなどアプリケーションに関するコマンドです.各パラメーターを見ていきます.

copilot app init

copilot app initでは

パラメーター 用途
--domain string Route53 で既存のドメイン名でアプリケーションを作成する
--resource-tags stringToString リソースタグを付与する
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot app ls

copilot app ls は Copilot で展開しているアプリを表示してくれるコマンドでパラメーターはヘルプ関連のみです.

パラメーター 用途
-h,--help ヘルプ情報を出したい時に使う

github.com

copilot app show

copilot app showではアプリケーションの設定,環境やサービスの情報を表示します.

パラメーター 用途
--json JSON で結果を返したい時に使う
-n, --name string アプリを指定して情報を表示したい時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot app delete

copilot app deleteではアプリケーションの関連リソースを削除します.

パラメーター 用途
--env-profiles stringToString プロファイルを指定して削除するために使う
—yes 確認をスキップするために使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot env

copilot envはデプロイメントステージに関連するコマンドです.各パラメーターを見ていきます.

copilot env init

copilot env initではサービスが動作する新しい環境を作成するコマンドです.

パラメーター 用途
-n, --name string 環境名を指定するために使う
--prod 本番環境用のサービスを含んでいる場合に指定する
--profile string プロファイルを指定する時に使う
-a,--app string プアプリケーション名を指定する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot env ls

copilot env lsはアプリケーションの全環境を表示するコマンドです.

パラメーター 用途
--json JSON で結果を返したい時に使う
-a, --app string アプリを指定して情報を表示したい時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot env shw

copilot env showではデプロイした環境の情報を表示するコマンドです.

パラメーター 用途
--json JSON で結果を返したい時に使う
-a, --app string アプリを指定して情報を表示したい時に使う
--resources 環境内にあるリソースを表示する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot env delete

copilot env deleteはアプリケーションから環境を削除するコマンドです.環境内に実行中のアプリケーションがある場合はまずcopilot svc deleteを実行する必要があります.

パラメーター 用途
-a,--app sting アプリケーション名を指定する時に使う
-n,--name string 環境名を指定する時に使う
--profiles string プロファイルを指定して削除するために使う
—yes 確認をスキップするために使う
-h, --help ヘルプ情報を出したい時に使う

copilot svc

copilot svcはサービスに関するコマンドです.各パラメーターを見ていきます.

copilot svc init

copilot svc initは新規のサービスを作るためのコマンドです.

パラメーター 用途
-d, --dockerfile string Dockerfile へのパスを指定する時に使う
-n, --name string サービス名を指定する時に使う
-t, --svc-type string サービスタイプを指定する時に使う
Load Balanced Web ServiceBackend Serviceを指定する
--port uint16 Load Balanced Web Service,Backend Serviceで使うポートを指定する時に使う

github.com

copilit svc show

copilot svc showは環境ごとのエンドポイント,キャパシティ,関連リソースなどデプロイされたサービスに関する情報を表示するコマンドです.

パラメーター 用途
-a, --app string アプリ名を指定する時に使う
--json JSON 形式で出力したい時に使う
-n, --name string サービス名を指定する時に使う
--resources サービスで使っているリソースを表示する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot svc ls

copilot svc lsは特定のアプリケーションのすべての Copilot サービスを一覧表示するコマンドです.

パラメーター 用途
-a, --app string アプリ名を指定する時に使う
--json JSON 形式で出力したい時に使う
--local ローカルの開発しているサービスを表示する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot svc logs

copilot svc logsはデプロイしたサービスのログを表示するコマンドです.

パラメーター 用途
-a, --app string アプリ名を指定する時に使う
--end-time string JSON 形式で出力したい時に使う
-e, --env string 環境名を指定する時に使う
--follow ログをストリーミングするかどうかを指定する時に使う
--json JSON 形式で出力したい時に使う
--limit int 返されるログイベントの最大数を指定する時に使い,デフォルトは 10 で返却される
-n, --name string サービス名を指定する時に使う
--since duration 5秒/2分/3時間といった時間を指定してそれよりも新しいログのみを表示したい時に使う
なお,start-time / since のいずれか一方のみ指定できない
--start-time string 特定の日付以降のログのみを返す時に使う
--start-time 2006-01-02T15:04:05+00:00 --end-time 2006-01-02T15:05:05+00:00 のように指定する
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot svc status

copilot svc statusはサービスの状態/タスクの状態/関連するCloudWatchアラームを含んだデプロイされたサービスのステータスを表示するコマンドです.

パラメーター 用途
-a, --app string アプリ名を指定する時に使う
-e, --env string 環境名を指定する時に使う
--json JSON 形式で出力したい時に使う
-n, --name string サービス名を指定する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot svc package

copilot svc packageは環境にサービスをデプロイするために使用されるCloudFormationテンプレートを生成する時に使うコマンドです.

パラメーター 用途
-e, --env string 環境名を指定する時に使う
-n, --name string サービス名を指定する時に使う
--output-dir string CloudFormation テンプレートを出力するディレクトリを指定する時に使う
--tag string コンテナイメージのタグを指定する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot svc deploy

copilot svc deployは環境にサービスをデプロイするためのコマンドです.

パラメーター 用途
-e, --env string 環境名を指定する時に使う
-n, --name string サービス名を指定する時に使う
--resource-tags stringToString リソースのタグを指定する時に使う
--tag string コンテナイメージのタグを指定する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

サービスのデプロイまでのステップ

なお,サービスのデプロイステップは次の5段階を経て行われます.

  1. ローカルの Dockerfile をイメージをビルドする
  2. タグを --tag で指定した値,もしくは最新のgit shaで指定した値でタグ付けする
  3. コンテナイメージを ECR にプッシュする
  4. マニフェストファイルとアドオンを CloudFormation にパッケージ化する
  5. ECS タスク定義とサービスの作成および更新を行う

copilot svc delete

copilot svc deleteはアプリケーションからサービスを削除する時に使うコマンドです.

パラメーター 用途
-e, --env string 環境名を指定する時に使う
-n,--name string サービス名を指定する時に使う
—yes 確認をスキップするために使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot pipeline

copilot pipelineはアプリケーションを継続的デプロイするためのパイプラインに関連するコマンドです.各パラメーターを見ていきます.

copilot pipeline init

copilot pipeline initはパイプラインを作るためのコマンドです.

パラメーター 用途
-e, --environments strings パイプラインにステージを追加する時に使う
-b,--git-branch string パイプラインをキックするブランチを指定する時に使う
-t, --github-access-token string GitHub のアクセストークンをしている時に使い,ファイルでも指定可
-u, --github-url string サービスで使っている GitHubリポジトリ URL を指定する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot pipeline update

copilot pipeline updateマニフェストファイルからアプリケーションに関連付けられた環境を使用してワークスペース内のサービスのパイプラインをデプロイするためのコマンドです.

パラメーター 用途
—yes 確認をスキップするために使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot pipeline show

copilot pipeline showはアプリケーション用にデプロイされたパイプラインの構成情報を表示するコマンドです.

パラメーター 用途
-a, --app string アプリ名を指定する時に使う
--json JSON 形式で出力したい時に使う
-n, --name string パイプライン名を指定する時に使う
--resources パイプラインで使っているリソースを表示する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot pipeline status

copilot pipeline statusはデプロイ済みのパイプラインのステージステータスを表示するコマンドです.

パラメーター 用途
-a, --app string アプリ名を指定する時に使う
—yes 確認をスキップするために使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot pipeline delete

copilot pipeline deleteはパイプラインを削除する時に使うコマンドです.

パラメーター 用途
--delete-secret パイプラインのソースリポジトリに関連付けられた Secrets Manager の秘密情報を削除する時に使う
-n, --name string パイプライン名を指定する時に使う
-h, --help ヘルプ情報を出したい時に使う

github.com

copilot deploy

copilot deplycopilot svc deployエイリアスとなっているコマンドで,サービスをデプロイするために使います.

copilot storage

copilot storage initはサービスに関連する新しいストレージリソースを作成するコマンドです.リソースとしては S3 と DynamoDB を指定でき,copilot svc deployでサービスと一緒にデプロイされます.v 0.1.0の頃にはなかったのでv0.2.0で追加されたコマンドでもあります.

パラメーター 用途
-t, --storage-type string DynamoDBS3 のどちらをストレージとして使うかを指定する時に使う
-n, --name string 作成するストレージ名を指定する時に使う
-s, --svc string 関連づけるサービス名を指定する時に使う

※DynamoDB を指定する時にのみ合わせて使えるパラメータ

パラメーター 用途
--lsi stringArray LSI を指定する時に使う
<keyName>:<dataType>のフォーマットで指定する
--no-lsi LSI の設定をスキップする時に使う
--no-sort ソートキーの設定をスキップする時に使う
--partition-key string パーティションキーを指定する時に使う
<keyName>:<dataType>のフォーマットで指定する
--sort-key string ソートキーを指定する時に使う
<keyName>:<dataType>のフォーマットで指定する

github.com

copilot version

copilot version は 「AWS Copilot CLI」のバージョンを表示してくれるコマンドでパラメーターはヘルプ関連のみです.

パラメーター 用途
-h,--help ヘルプ情報を出したい時に使う

github.com

copilot completion

copilot completionbashzsh といったシェルの補完のためのコマンドでパラメーターはヘルプ関連のみです.

パラメーター 用途
-h,--help ヘルプ情報を出したい時に使う

github.com

copilot docs

copilot docsは「AWS Copilot CLI」のドキュメントページを開いてくれるコマンドです.パラメーターはヘルプ関連のみです.

パラメーター 用途
-h,--help ヘルプ情報を出したい時に使う

まとめ

AWS Copilot CLI」のコマンドとそのパラメーターをそれぞれで見ていきました.CLI ツールでできることを確認してまた「AWS Coplit」のツールの理解が深まりました.現時点のコマンドとパラメーターをざっと見て,copilot storagecopilot pipelineも使ったことがないので試して別の記事で学んだことをまとめます.

関連記事

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

東京都のオープンデータを使ってデータの可視化を QuickSight で実践しよう!

タダです.

QuickSight のハンズオンを試してみて,やっぱりオープンデータを使って自分なりに可視化してみたい!と思ったので東京都が公開している新型コロナウイルス関連のデータを可視化してみます.

stopcovid19.metro.tokyo.lg.jp

可視化対象のデータセット

東京都が公開している新型コロナウイルス陽性患者の発表詳細が CSV データとして公開されています.ハンズオンでもやりましたが,CSV データを QuickSight に食わせることでデータ可視化ができます.

catalog.data.metro.tokyo.lg.jp

データセットの中身

CSV データの中身は次のカラムがあります.

  • No
  • 全国地方公共団体コード
  • 都道府県名
  • 市区町村名
  • 公表_年月日
  • 曜日
  • 発症_年月日
  • 患者_居住地
  • 患者_年代
  • 患者_性別
  • 患者_属性
  • 患者_状態
  • 患者_症状
  • 患者_渡航歴の有無フラグ
  • 備考
  • 退院済フラグ

2020年7月27日時点で僕が見た限りですが,以下の項目は大半のデータが入ってなかったので,可視化のデータから外しています.

  • No
  • 市区町村名
  • 発症_年月日
  • 患者_属性
  • 患者_状態
  • 患者_症状
  • 患者_渡航歴の有無フラグ
  • 備考
  • 退院済フラグ

データの可視化してみた結果

3つのデータ可視化をしてみました.1つ目は折れ線グラフによる日別の患者公表件数と退院済みの患者数を表しました.オレンジ色の線が日別の陽性と判定された人数で青色の線が退院済みの人数です.こう見ると緊急事態宣言が解除された5月末まではほぼ2つの数値は同数だったけど,7月に入ってその開きがでているのがわかります.日ごとに感染者数が増えている一方になっているので不要不急な外出や人混みは避けて予防に努めたいところです.

f:id:sadayoshi_tada:20200727062554p:plain

2つ目は日ごとのエリア別発症された患者数を表しました.これは面グラフで表現しましたが,赤色が都民の患者数です.圧倒的な数です.発症した患者の居住地と一緒に感染の導線になっているエリアもわかるとヒートマップ的に可視化できるかもしれないなと思います.

f:id:sadayoshi_tada:20200727063255p:plain

3つ目は年代別の患者数の割合を表しました.20,30代が大半を占めています.仕事やプライベートの外出が盛んだからかなと予想します.

f:id:sadayoshi_tada:20200727063539p:plain

ハンズオンを経験して CSV データの取り込みからデータを表現する時に QuickSight のどこをどう触ったり,設定すれば可視化できるかを学べたのを活かせたと思います.

まとめ

QuickSight を使ってデータの可視化を実践しました.各種報道で発表されている感染者数にばかり目がいってしまいがちですが,東京都が公開している情報をみて今どんな状況なのかをデータを見えやすい形にして判断できる情報が提供さています.実際のデータを見てみると新しい見方や気づきを得られるかもしれないので,気になる人は試しにデータのダッシュボードを作ってみて欲しいです.

関連記事

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

AWS CDK アプリケーションの継続的デプロイメントを実装する『CDK Pipeline』を実践した

タダです.

現在プレビュー版ではありますが,AWS CDK アプリケーションの継続的デプロイメントを行う「CDK Pipeline」の記事が出ていたので記事を参考にこの機能を試してみました.記事を通してどんな実装を試せるのか,試してみての所感をまとめていきます.

日本語のアナウンスブログ aws.amazon.com

英語のアナウンスブログ aws.amazon.com

ドキュメント docs.aws.amazon.com

記事を試す上での諸注意

記事のハンズオンを試していく上で諸注意として次の点があります.始める前に確認しておきましょう.

  • AWS CDK CLI のバージョンが1.51.0以降である必要があります.
  • GitHub アカウントが必要です.
  • GitHubリポジトリを CodePipeline からアクセスできるようにアクセストークンを Secret Manager に登録しておきます.
    • こちらのドキュメントを参考に登録しましょう.

どんな実装を試せるのか

アプリケーションとしては API Gateway と Lambda を組み合わせて簡単なレスポンスを返すものですが,継続的デプロイメントのパイプラインとして以下の実装を試せます.

  • GitHub からソースコードをとってきてビルドし,そのコードをデプロイする
    • GitHub にコードを push したら動作するパイプライン
  • 別のアカウントとリージョンにデプロイする
  • 検証として API Gateway と Lambda のエンドポイントにリクエストを投げるテスト
  • 開発期間中には何度も繰り返しデプロイするための開発用アカウントへのデプオリ

所感

記事のパイプラインをコード化して継続的デプロイメントを行っていくわけですが,取り組んでみて「CDK Pipeline」のおかげでコードの記述数が少ない印象を持ちました.CloudFormation を使った場合,足回りのサービスを作り上げるまでに時間を要するところが短縮されます.

また,プレビュー版なのでまだ実戦投入とはいかないとは思いますが,CodePipeline を CI/CD を使っているところでは「CDK Pipeline」と組み合わせて環境用途ごとにパイプラインを分けたり,本番利用などの普段のオペレーションに当てはめてプレビューの段階から適用できるかを検討してみてるのはいかがでしょうか.何度もパイプラインを構成したり,別環境に横展開する際にコード化されているのはメリットだし,スピーディーな展開が可能だと思います.

まとめ

プレビュー中の「CDK Pipeline」を試してみたので記事を通してどんなパイプラインを作れるか,所感を簡単にまとめました.CodePipeline を使っていたり,使うことを検討している人たちにとって検討価値のある機能追加だと思うので,気になる方は試してみてください!