AWS CDKでCloudFormation StackSetsで展開するIAM Roleを作る

AWS Organizationsで管理している組織に展開するCloudFormation StackSetsのテンプレートを生成するCDKのコードを載せておきます。 今回は例なので、AdministratorAccessというかなり強い権限がついているので、実際には別のマネージドポリシーや自前のポリシーを展開することが多いですね。

import * as cdk from '@aws-cdk/core';
import * as iam from '@aws-cdk/aws-iam';

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

    // AccountOwnerAccessRole
    const ownerRole = new iam.Role(this, 'AccountOwnerAccessRole', {
      roleName: 'AccountOwnerAccessRole',
      assumedBy: new iam.AccountPrincipal('XXXX'),
      managedPolicies: [
        iam.ManagedPolicy.fromAwsManagedPolicyName('AdministratorAccess')
      ],
    });
  }
}

これを書いた後に、cdk synthを実行して出力された結果を何らかの方法で登録・更新すればOK。 Organizationsに対して一括適用したい場合は、Terraformを利用するよりかは、CloudFormation StackSetsを利用した方が良いですね。

GSuite BasicからGoogle Workspace Business Starterに切り替える

Googleから催促のメールがきていたので切り替えました。 その時のメモになります。

流れ

公式ドキュメントを参考にしながら、以下の流れで対応しました。

  1. プラン変更時の差分を確認
  2. 組織の設定変更
  3. プランの変更

support.google.com

プラン変更時の差分を確認

今回はBusiness Starterに切り替えるので、以下のページで差分を確認しました。

support.google.com

具体的な差分については引用しますが、

  • Chat の管理機能 - 履歴のオンとオフを切り替えることはできません。また、ユーザーに Chat の招待状を自動的に承諾させることはできません。
  • 高度なエンドポイント管理 - 会社所有のモバイル デバイスを設定したり、モバイル デバイスに個別にアプリを配信したりすることはできません。
  • 組織のブランディング - Google ドキュメントスプレッドシート、スライド、フォーム、サイトのカスタム テンプレートを作成、使用することはできなくなります。テンプレートから作成されたドキュメントは残ります。
  • Chat スペースの高度な機能 機能 - 外部ユーザーが参加できるスペースを作成することはできなくなります。既存のスペースは残り、ユーザーはこれらのスペースにメンバーの追加または削除といった変更を加えることができます。

以下の4つになります。 このうち私が影響を受ける範囲は、「高度なエンドポイント管理」のみでした。

プランの変更画面でもどういった差分があるのかは確認できます。

f:id:corrupt952:20211117031535p:plain

組織の設定変更

「高度なエンドポイント管理」のみ影響があることが分かったので、以下を参考しながら作業をしました。

support.google.com

特に問題はないと思いますが、設定漏れがあると面倒臭そうです。

プランの変更

ドキュメント通りに設定変更すれば問題ないので特筆することはないですが、割当ライセンス数と請求金額だけはチェックしておいた方が良いです。

ForegroundでCronを実行した時に処理の標準出力,標準エラー出力をCronの標準出力,標準エラー出力にリダイレクトする

ForegroundでCronを実行した時にCronで実行される各処理の標準出力,標準エラー出力に出力した内容は、 Cronの標準出力,標準エラー出力に出力されずにいずこかへ消えます。 今回は、各処理Cronの標準出力,標準エラー出力にリダイレクトして出力させます。

先に答えを書いておくと /proc/{CronのプロセスID}/fd 配下の12にそれぞれを出力すればOKです。

* * * * * /main.sh >/proc/$(</var/run/crond.pid)/fd/1 2>/proc/$(</var/run/crond.pid)/fd/2

/proc/{CronのプロセスID}/fd/1 などは、/dev/pts/1 などのデバイスファイルのシンボリックファイルなので、 procfsが実装されていない環境では、lsofから標準出力,標準エラー出力のデバイスファイルのパスが取得できます。 そのパスに出力すれば似たような挙動を得られます。

ただし、このやり方はrootユーザでの話なので、別ユーザで実行する場合については別記事で書こうかなと思います。

環境

今回はprocfsが使えるLinuxで検証したかったので、以下のDockerfileで環境を作ってコンテナ上でcron -fを実行して確認しました。

FROM ubuntu:20.04

RUN apt-get update && \
    apt-get install --no-install-recommends -y cron vim && \
    rm -rf /var/lib/apt/lists/*

CMD ["bash"]

Remote - WSL拡張を使ったVSCodeで新規ファイルをcodeコマンドから開けない

この問題で無駄に時間を消費してしまったんですが、Remote - WSL拡張を使ったVSCodeで新規ファイルをcodeコマンドから開けない現象に遭遇しました。

2021/11/15 追記分

System Installerでなくとも、1.62.1(1つ前のバージョン)のUser Installerでも問題が発生しないことは確認できています。

github.com

アップデートされると問題が再発するので、自動アップデートがされないように設定を変更しておくことをオススメします。(あまり良くはないですが)

2021/11/14 に書いてた部分

結論としては原因不明だったのですが、元々VSCodeをUser Installerでインストールしていて1.62.2にアップグレードしたら発生した気がしていたので、 1.62.0のSystem Installerでインストールし直したら再発しなくなりました。

問題が起きていた環境

解決した環境

nっぽいkustomizeバージョン管理ツールを書いた

Node.jsのバージョン管理ツールであるnっぽい、Kustomizeバージョン管理ツールを書いてみました。

github.com

元々kustomizeをインストールするためのサポートスクリプトがあって、これは指定したバージョンをインストールすることも可能なんだけど、複数バージョンをいい感じに扱うのはできなかったです。

kubectl.docs.kubernetes.io

そして、複数バージョンのkustomizeが使いたくなるケースが増えてきたので、nを参考にしつつ最低限のコマンドだけ書くかーと思い立ちました。 Argo CDで使うKustomizeのバージョンを固定化しているケースなどでは、ローカルで複数バージョンのkustomizeを動かしたいケースもそれなりにあるので、 こうしたツールが欲しいと探していたけど、パッと見つからなかったですし。

インストール

基本的にREADMEに書いてある通りで、kzのスクリプトファイルをダウンロードして実行権限を付与してパスが通るところに配置すればOK。

curl -L https://raw.githubusercontent.com/corrupt952/kz/main/bin/kz -o kz
chmod u+x kz
mv kz /path/to/bin

後は環境変数を設定するのがオススメ。 nのようにデフォルトだと、/usr/localにインストールしようとするので、それが嫌なら$HOME/.cacheとかにインストールすると良いです。

export KZ_PREFIX=$HOME/.cache/kz
export PATH=$KZ_PREFIX/bin:$PATH

使い方

kustomizeのインストール

nのような操作感でKustomizeをインストールできます。 インストール後には、$KZ_PREFIX/binに指定したバージョンのバイナリへのシンボリックリンクを配置します。 正直なところ、次で説明するuseと差別化はできていないですね。

kz i v3.9.3

kustomize version
# {kustomize/v3.9.3  2021-02-07T17:02:13Z  }

バージョンの切り替え

指定したバージョンのkustomizeへのシンボリックリンクを、$KZ_PREFIX/binに指定したバージョンのバイナリへのシンボリックリンクを配置します。 指定したバージョンがインストールされていなかったらインストールするようにもしています。

kz use v3.9.3

kustomize version
# {kustomize/v3.9.3  2021-02-07T17:02:13Z  }

指定したバージョンでの実行

$KZ_PREFIX/binにパスを通したり、切り替えをしなくても指定したバージョンのkustomizeで、 コマンドを実行するexecも追加してみました。

kz exec v3.9.3 vesrion --short
# {kustomize/v3.9.3  2021-02-07T17:02:13Z  }

kz exec v4.4.0 vesrion --short
# {kustomize/v4.4.0  2021-09-27T16:24:12Z  }

複数バージョンのkustomize間でビルドしたマニフェストを比較したい時に重宝しています。

さいごに

それぞれのバージョンのkustomizeコンテナでやれっていう話かもしれないけど、ローカルで動かせるバイナリに関してはローカルで動かしたほうが速いので許してください 🙇 あと、似たようなツールでいい感じのがあれば教えて下さい!

GitHub OrganizationでSSO認証必須にすると少し困ること

GitHub OrganizationでSSO認証を必須にすると、困るケースが出てきたので軽くまとめておきます。

困るケースは以前ツイートした以下の内容になりますが、かなり限定的なケースだと思います。

改めて困る条件をまとめると、

  • 1つ以上のSSO認証必須のOrganizationに属している
  • SSO認証必須のOrgnization内に公開リポジトリ(何らかのプラグインなどのOSS)がある
  • プライベートなど業務以外で、その公開リポジトリを利用した時に、SSO認証していないPCからIssueを投げたくなった

という条件が重なったなった時に、Issueを投げたくなっても投げられないという状況になりました。

「SSO認証すれば良い」だけの話なんですが、未ログインもしくはOrganizationに所属していないユーザではできる操作が、 「SSO認証されていない所属しているユーザだとできない」というのが少しモヤッとしているところです。

これからGitHub OrganizationでSSO認証を必須にするという場合は、OSS活動などで利用している公開リポジトリがこういう風に困るケースがないかは確認しておいたほ方が良いかも知れません。

おまけ

SSO認証せずに自分のプロフィールページを開くと、SSO認証が必要な組織のContributionが表示されないです。

未ログインのユーザから見たcorrupt952のプロフィールページ。

f:id:corrupt952:20210927000214p:plain

こっちがcorrupt952でログインはしているが、必要なSSO認証をしていない場合に見えるプロフィールページ。

f:id:corrupt952:20210927000451p:plain

systemdでサービスの有効化と起動をワンラインで実行する

昨日VPNサーバを構築した際に知ったのですが、比較的新しいバージョンであれば有効化と起動をワンラインでできるようです.

man.kusakata.com

例えばnginxサービスをsystemdで有効化と起動をすると言えば、

systemctl enable nginx
systemctl start nginx

といった書き方でしたが、バージョン220から使えるようになった--nowオプションを使うことでワンラインで実行できます.

systemctl enable --now nginx

無効化と停止も同様に書けます.

systemctl disable --now nginx

昔よく触っていた時代と比べて、便利になっていて助かります.

VPNサーバを構築した記事

khasegawa.hatenablog.com