[re:Invent2019] EC2 Image Builderを使ってPowerShell Coreをインストールしてみた #reinvent

しばたです。
先日のキーノートで発表され既に弊社社員により多くの記事が書かれているEC2 Image Builderですが、Build ComponentにPowerShell Coreが用意されていることを知ったためPowerShellおじさんとしては重複上等でブログを書かずにはいられませんでした。

EC2のイメージ作成を劇的に効率化するEC2 Image Builderが発表されました! #reinvent

(上記の「関連記事」でその他の試してみた記事にもアクセスできます)

前準備

EC2 Image Bbuilder(以後Image Builder)ではEC2インスタンスでパイプラインを実行するにあたり所定のIAMロールを必要とします。
必要なロールはパイプラインの種類によって適宜適切に設定する必要がありますが、単純にPowerShell CoreをインストールするだけであればEC2InstanceProfileForImageBuilderAmazonSSMManagedInstanceCoreポリシーを割り当ておけばよいです。
IAMロールの作成は様々な方法で可能ですが本記事では適当なCloudFormatin Templateから作成しておきます。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  RoleName:
    Description: "Input role name."
    Type: String
    Default: "EC2RoleForImageBuilder"
Resources:
  # IAM Role
  ImageBuilderRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName:
        Fn::Sub: "${RoleName}"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/EC2InstanceProfileForImageBuilder"
        - "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
  # Instance Profile
  ImageBuilderRoleInstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      InstanceProfileName:
        Fn::Sub: "${RoleName}"
      Path: "/"
      Roles:
        - Ref: ImageBuilderRole

WindowsにおけるPowerShell Coreのインストール手順

まずはWindows ServerにPowerShell Coreをインストールしてみます。
サーバーはWindows Server 2019、手順自体は既に他の社員がブログを書きまくってますので要点だけ解説する形ですすめます。

1-1. Define recipi : Source Image

Image Builderの作成ウィザードから最新のWindows Server 2019 Baseイメージを選択します。

1-2. Define recipi : Build components

検索欄に「powershell」と打てばPowerShellのコンポーネントが表示されるので選択します。

1-3. Define recipi : その他

その他項目は特に指定せず次へ進みます。

2. Pipeline

Pipeline設定はIAM Roleに前項で作成したロールを割り当てる以外は環境に応じた設定にします。
今回は名前以外全てデフォルトのままにしています。

3. additional settings - optional

追加の設定も環境に応じて行います。
今回は全てデフォルトです。

4. 以降の作業

あとは設定内容の確認だけですのでそのままイメージの作成を進めればOKです。
特にエラー無く無事パイプラインが作成できました。

あとはよしなにイメージを作成すればOkです。

Amazon LinuxにおけるPowerShell Coreのインストール手順

Linuxの場合でもWindowsとほとんど同じです。
Source ImageのOSがLinuxなのとBuild componentsの名称がすこし違うくらいです。

Build componentの実装について

一度イメージを作るとそのイメージのレシピからbuild componentの中身を見ることができました。

Windows版の実装

Windows版の実装はGitHubのリポジトリからMSIインストーラーをダウンロードしてサイレントインストール、PowerShellコマンドでPATH環境変数を更新というあるあるの実装でした。
現在のバージョンではMSIインストーラーのオプションで環境変数の更新までできる様になっているのでどうにかしてフィードバックしたいです...

Linux版の実装

Linux版の実装はRHELの手順と同様のものをBashから実行する形となっていました。
余談なのですが、表立ってドキュメント化されてないもののAmazon Linux 2でもPowerShell CoreはRHELと同じ手順でインストール可能で、GitHubに以下のインストールスクリプトも用意されていたりしてます。

最後に

ざっとこんな感じです。

現実にはPowerShell Coreをインストールした後に各種ビルドタスクを実行することになると思います。
ビルドタスク向けのPowerShell Coreのインストールには.NET Core Global ToolsによるインストールもありますがAWS統合を重視する場合はImage Builderを選択すると良いでしょう。