Pulumiはプログラマーにとって慣れ親しんだ言語でインフラを構成できるモダンなIaCツールです。
小規模なプロジェクトで1人で何役もやっている人にとって、生産性が高いかもしれません。
イケてると思ったポイントや、ググってもサクッと分からなかった様な話を記事にしていきます。
前提条件
- Pulumi及びAWSの設定が完了している
ARNを参照するコード
あるリソースのプロパティを元に、別のリソースのプロパティを設定したいケースが度々あります。
うまく動いたケース、うまく動かなかったケース、どのように修正したかを紹介します。
うまく動いたケース例
const policy = new aws.iam.Policy(`PolicyName`, {
description: "{省略}",
policy: `{省略}`,
});
const policyAttachment = new aws.iam.RolePolicyAttachment(
`SomeRolePolicyAttachmentName`,
{
role: lambdaRole.name,
policyArn: policy.arn, // <----------上で作成したPolicyのARNを直接指定している
}
);
この場合、policyArnプロパティに対して直接arnを指定しています。
このとき、policyArn の型は pulumi.Input<string>
で、policy.arnの型は pulumi.Output<string>
です。
うまく動かなかったケース例
const queue = new aws.sqs.Queue(`SomeQueueName`, {
fifoQueue: true,
redrivePolicy: JSON.stringify({
deadLetterTargetArn: deadLetterQueue.arn, // <----------オブジェクトの値として指定している
maxReceiveCount: 10,
})
});
これだと、deadLetterQueue.arn をうまく解決してくれません。
このとき、deadLetterTargetArnは pulumi.Input<string>
型ではありません。
以下が修正
const queue = new aws.sqs.Queue(`QueueExample`, {
fifoQueue: true,
redrivePolicy: deadLetterQueue.arn.apply((arn) =>
JSON.stringify({
deadLetterTargetArn: arn,
maxReceiveCount: 4,
})
),
});
apply関数を適用することで、値が解決され、このケースでもうまく動くようになります。
pulumi.Output<T>
型 に関しては、インフラのプロビジョンが完了するまでその値が決定しない為、Promiseと似た非同期処理の形を取るようです。Apply関数を利用することで値が解決され、実際の値を取得可能です。
ドキュメントを見た限りでは、リソースのプロパティで pulumi.Input<T>
の型に対しては、pulumi.Output<T>
を直接指定しても、Pulumiが内部的に解決してくれるようです。