AWS CDKでEC2にIAMロールを割り当てる時の覚書

参考になる記事があまりなかったのでまとめました

前提情報

AWS CDKのVersion1.35.0時点のコンテンツです。アップグレードによる変更などで参考にならなくなる可能性もありますのでご了承ください。

やりたいこと

AWS CDKで作成したEC2インスタンスにIAMロールを設定したい

コード

数が多いので、リソース毎に

IAM Policy

import {
    ManagedPolicy, Effect, PolicyStatement
} from '@aws-cdk/aws-iam'
import { Stack } from '@aws-cdk/core';

export class IAMPolicyForCloudFront {
    public static create(stack: Stack) {
        const statement = new PolicyStatement({
            effect: Effect.ALLOW,
        })
        statement.addActions(
            "cloudfront:*Invalidation*",
            "cloudfront:*getDistribution*"
        )
        statement.addResources('*')
        const managedPolicy = new ManagedPolicy(
            stack,
            'IAMPolicyForCloudFront',
            {
                description: "To access CloudFront from WordPress",
                statements: [
                    statement
                ]
            }
        )
        return managedPolicy
    }
}

IAM Role

import { Stack } from "@aws-cdk/core";
import { Role, ServicePrincipal } from "@aws-cdk/aws-iam";
import { IAMPolicyForCloudFront } from "./CloudFront";

export class EC2InstanceRole {
    public static create(stack: Stack) {
        const role = new Role(
            stack,
            'IAMInstanceRole',
            {
                managedPolicies: [
                    IAMPolicyForCloudFront.create(stack)
                ],
               assumedBy: new ServicePrincipal("ec2.amazonaws.com"),
               path: '/'
            }
        )
        return role
    }
}

EC2 Instance

import { Stack } from "@aws-cdk/core";
import { CfnInstanceProfile } from "@aws-cdk/aws-iam";
import { CfnInstance } from '@aws-cdk/aws-ec2';
import { EC2InstanceRole } from './Role"

export class InstanceProfile {
    public static create(stack: Stack) {
        const instanceRole = EC2InstanceRole.create(stack)
        const iamInstanceProfile = new CfnInstanceProfile(
            stack,
            'InstanceProfile',
            {
                path: '/',
                roles: [instanceRole.roleName]
            }
        )
        const instance = new CfnInstance(
            stack,
            'Instance',
            {
               iamInstanceProfile: iamInstanceProfile.ref,
               ...

Comment