Azure DevOps のCI/CDパイプラインを使って、AWS環境へCloudFormationスタックをデプロイする

2021.10.12

いわさです。

最近いろいろな環境でのCI/CDパイプラインを触っているのですが、Azure DevOpsからCloudFormationスタックをデプロイする機会があったので方法を調べました。
以前、AWSリソースをデプロイする方法について以下の記事で触れたことがあります。

この記事ではクラシックエディターという、GUIベースでパイプラインを組み立てるエディターを使っております。
最新の環境ではYamlエディターにGUIを使ったタスクを追加するような作りになっているのですが、試したことがなかったので試してみました。

AWSリソース

以下のCloudFormationテンプレートをデプロイします。
サンプルのVPCです。

AWSTemplateFormatVersion: '2010-09-09'
Description: azure devops
Parameters:
  VpcCidr:
    Type: String
    Default: 10.0.0.0/16
    Description: ""

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCidr
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
      Tags:
      - Key: Name
        Value: "hoge"

上記テンプレートはAzure DevOpsのGitリポジトリへ登録しておきます。

次に、Azure DevOps側にクレデンシャルの登録が必要なのでIAMユーザーを作成します。

なお、Azure DevOpsへのクレデンシャル登録関係はAWSドキュメントにリソースが用意されています。

クレデンシャル登録

先程作成したIAMユーザーの認証情報をパイプライン構築前に登録します。
Azure DevOpsではService connectionsという機能で、外部クレデンシャルを安全に管理することが出来ます。
GitHubクレデンシャルみたいなイメージです。

サイドメニューのProject settings -> Service connections -> AWS を選択します。

アクセスキーとシークレットを登録しました。
今回は割愛しますが、認証オプションは他にもいくつかあります。スイッチロール環境でも使えます。

Service connectionsに表示されたら成功です。
のちほどパイプライン構築時に、ここで作成したクレデンシャルを選択します。

パイプライン作成

ではパイプラインを作成します。

今回はデプロイするテンプレートをAzure DevOpsのGitリポジトリ(Azure Repos Gitと呼ぶらしい)に登録していますので、そちらを選択します。
なお、ここでUse the classic editorを選択するとよりGUIベースの構築画面を使うことが出来ます。
VSTS(Visual Studio Team Services)時代から使っていた方はそちらのほうが馴染むかもしれません。

パイプラインのテンプレートにAWSのものはありませんので、ベーシックなStarter pipelineを選択しましょう。

YAMLファイルが表示されたらステップを編集していきます。
右側のアシスタント機能を使うとGUIでタスクを追加することが出来ます。

AWS Toolkit for Azure DevOpsの拡張機能がインストールされたAzure DevOps環境であれば、AWS関連のタスクが選択出来るようになっていると思います。
今回はCloudFormationスタックをデプロイするため、AWS CloudFormation Create/Update Stack ...を選択します。

タスクの詳細情報を入力します。
先程作成したクレデンシャルの他、リージョンやスタック名、CloudFormationテンプレートファイル名などを入力します。

Template SourceにAmazon S3を指定することも可能です。
その場合はS3バケットの指定が必要になります。

Template Parameters SourceではCFnへのパラメータを指定出来ます。
指定方法はファイルによる指定とインラインでの入力が可能です。どちらもJson形式です。
今回は、VPCのCIDRをデフォルトから変更してみましょう。

タスクを追加すると、以下のYAMLが作成されます。
いくつか不要なダミーステップなどが含まれますが、悪影響はないので今回はこのままでいきます。

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- main

pool:
  vmImage: ubuntu-latest

steps:
- script: echo Hello, world!
  displayName: 'Run a one-line script'
- task: CloudFormationCreateOrUpdateStack@1
  inputs:
    awsCredentials: 'iwasa-azure-devops'
    regionName: 'ap-northeast-1'
    stackName: 'iwasa-stack'
    templateSource: 'file'
    templateFile: 'hoge.yaml'
    templateParametersSource: 'inline'
    templateParameters: |
      [
        {
          "ParameterKey":"VpcCidr",
          "ParameterValue":"10.100.0.0/16"
        }
      ]
    capabilityAutoExpand: true

- script: |
    echo Add other tasks to build, test, and deploy your project.
    echo See https://aka.ms/yaml
  displayName: 'Run a multi-line script'

保存と実行を行うと、YAMLファイルの保存とジョブの実行が同時に開始されます。
保存したYAMLファイルはリポジトリのルートにそのままコミットされます。

デプロイジョブ実行

デプロイジョブが実行されました。
CloudFormationの詳細な実行結果をジョブのログから確認することも出来ます。

AWSのCloudFormationコンソールを確認してみると、新規スタックが作成されています。

VPCリソースも作成されており、CIDRはインプットパラメータとして指定したものになっていました。

さいごに

今日はAzure DevOpsからCloudFormationスタックをデプロイしてみましたが、本当に簡単です。
AWS Toolkit for Azure DevOpsすごい便利ですしドキュメントもしっかりしています。
Azureって名前ついてますがAzureと全然関係ないですし、この拡張機能を使うとAWSとの親和性もなかなかです。

もしCodeシリーズ以外のCI/CDサービスを検討し始めたときは、Azure DevOpsのことも思い出してあげてください。