目次
概要
こんにちは、テクニカルサポートの牛山です。
今回は、前回に引き続き「CLOUDFORMATION-INCLUDE CDK MODULEを使ってみる」に関する記事の第3回目となります。
目的
AWSの 「CloudFormationスタックをCDKコードに移行したリソースを参照」 することを理解する。
ゴール
「AWS CDKコマンドを用いてAWSリソースを操作」 できる。
前提条件
- AWSアカウント
- 前回、第1回目、第2回目のすべてを網羅し完了している。
前置き
前回、第2回目の記事では移行したCloudFormationスタックCDKコードを変更し、AWSリソースの設定変更をするところまで解説しました。
※ CLOUDFORMATION-INCLUDE CDK MODULEを使ってみる2
前回は既存IAMロールに対してS3の読取り権限を付与しましたが、新たに、IAMロールを作成し、前回同様に「aws-cdk-test」バケットへの頼取り権限を付与し任意のリソースを参照できることを確認します。
手順
事前確認
作業をおこなう前に、 「cdk diff」 コマンドで 「There were no differences」 と出力されることを確認します。
[ec2-user@dev my_cicm_proj]$ cdk diff
Stack MigrationStack
There were no differences
下記コマンドで前回、設定を有効にした、「BlockPublicAcls」が 「true」 になっていることを確認します。
get-public-access-blockリファレンス
[ec2-user@dev my_cicm_proj]$ aws s3api get-public-access-block --bucket aws-cdk-test
{
"PublicAccessBlockConfiguration": {
"IgnorePublicAcls": false,
"BlockPublicPolicy": false,
"BlockPublicAcls": true,
"RestrictPublicBuckets": false
}
}
新規IAMロールの作成およびS3バケットへの読取り権限付加
通常、aws-cdk-testバケットに対して読取りアクセス可能なIAMロールを作成する場合、ロールが実行できるすべてのアクションを明示的にリスト指定しなければいけませんが、これにはS3やIAMに対する詳しい知識が必要かつ、コードが長くなってしまうため、これら煩雑な処理を手軽に処理できる 「CDK Construct Library」 を使用します。
後ほどでてくる「cdk deploy」コマンドの結果に下記のような情報が出力されますのでメモるようにしてください。
[+] AWS::IAM::Role Role Role1ABCC5F0
[+] AWS::IAM::Policy Role/DefaultPolicy RoleDefaultPolicy5FFB7DAB
これから、編集および参照するファイルの位置
my_cicm_proj
├─ lib
│ │
│ ├─ my_cicm_proj-stack.ts
[ec2-user@dev my_cicm_proj]$ vi lib/my_cicm_proj-stack.ts
import * as cdk from '@aws-cdk/core';
import * as cfn_inc from '@aws-cdk/cloudformation-include';
import * as s3 from '@aws-cdk/aws-s3';
+ import * as iam from '@aws-cdk/aws-iam';
export class MigrationStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
const cfnInclude = new cfn_inc.CfnInclude(this, 'Template', {
templateFile: 'migrationStackTemplate.json',
});
const cfnBucket = cfnInclude.getResource('Bucket') as s3.CfnBucket;
cfnBucket.publicAccessBlockConfiguration = {
blockPublicAcls: true,
};
+
+ const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
+
+ const role = new iam.Role(this, 'Role', {
+ assumedBy: new iam.AccountRootPrincipal(),
+ });
+ bucket.grantRead(role);
}
}
挿入行は「+」、削除行については「-」から始まる行で示される。
cdk diffコマンドで「AWS::IAM」差分がでることを確認します。
[ec2-user@dev my_cicm_proj]$ cdk diff
Stack MigrationStack
IAM Statement Changes
・
・[中略]
・
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)
Resources
[+] AWS::IAM::Role Role Role1ABCC5F0
[+] AWS::IAM::Policy Role/DefaultPolicy RoleDefaultPolicy5FFB7DAB
「cdk deploy」コマンドでAWSリソースに対して変更の適用をおこないます。
デプロイが正常に完了すると画像のような形になります。
[ec2-user@dev my_cicm_proj]$ cdk deploy
This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:
IAM Statement Changes
・
・[中略]
・
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:************:stack/MigrationStack/b4796c60-3a60-11eb-bfb8-0ed8a3d6a1de
「cdk diff」コマンドで「There were no differences」とでることを確認します。
[ec2-user@dev my_cicm_proj]$ cdk diff
Stack MigrationStack
There were no differences
「aws iam get-role-policy」APIを使用してAWS上にIAMロールが作られかつ「aws-cdk-test」バケットに対する読取りアクセス権限が付与されていることを確認します。
get-role-policyリファレンス
引数で指定する (「--role-name」) 対象、IAMロール名がコマンド結果に出力されておらずすぐには確認が行えませんでしたので ブラウザからAWSにログインし、サービスよりIAMにいき Role1ABCC5F0
が存在することを確認します。
Role1ABCC5F0
と RoleDefaultPolicy5FFB7DAB
に関しては、先ほどメモっておいた情報からわかるようになっています。
実際に確認をおこなったキャプチャを載せていますのでご確認いただければと思います。
[ec2-user@dev my_cicm_proj]$ aws iam get-role-policy --role-name MigrationStack-Role1ABCC5F0-1U1PHQWUILM69 --policy-name RoleDefaultPolicy5FFB7DAB
{
"RoleName": "MigrationStack-Role1ABCC5F0-1U1PHQWUILM69",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject*",
"s3:GetBucket*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::aws-cdk-test",
"arn:aws:s3:::aws-cdk-test/*"
],
"Effect": "Allow"
}
]
},
"PolicyName": "RoleDefaultPolicy5FFB7DAB"
}
各種リソースの削除
「cdk destroy」を使って作成した各種リソースの削除をしておきます。
またデプロイに実行したEC2インスタンスの削除するようにします。
「cdk destroy」で削除されるものは、「cdk deploy」コマンドでデプロイしたものが削除されるようになっています。
課金が発生し続けても問題ないのであればとくに実施する必要はありません。
[ec2-user@dev my_cicm_proj]$ cdk destroy
Are you sure you want to delete: MigrationStack (y/n)? y
MigrationStack: destroying...
8:07:02 | DELETE_IN_PROGRESS | AWS::CloudFormation::Stack | MigrationStack
✅ MigrationStack: destroyed
まとめ
無事に、既存IAMロールに対してS3の読取り権限を付与し、新たな、IAMロールに対しても同様の権限を付与することができました。
これでこのIAMロールに切り替えることにより、限定的なAWSリソースへの参照が可能になります。
プロフィール
AWSの設計・構築をメインにおこなっています。
運用・保守をおこなう部署におりましたが、最近、アーキテクト課に異動しました。
日々精進しております。
LINK
クラウドベリージャム:プロフィールページ