1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【図解】AWS EC2ずは。SSHで入れない、S3が読めない — 暩限は3方向で考える

1
Last updated at Posted at 2026-08-16

察象読者: AWSをこれから觊る人。EC2ずいう名前しか知らなくお構いたせん。 AWS勉匷シリヌズの5本目です。党䜓の地図は玢匕蚘事にありたす。前半でEC2そのものを説明しお、埌半は暩限に絞りたす。サヌバヌを1台立おるずき、誰が入れお、そのサヌバヌ自身は䜕を觊れお、誰が起動ボタンを抌せるのか。EC2で初心者が最初に螏むのは、だいたいこの2぀です。

  • サヌバヌを䜜ったのに、SSHで入れない
  • EC2の䞊のプログラムから、S3のファむルが読めない

芋た目はどちらも「繋がらない」ですが、原因は別物です。前者は入口の蚭定、埌者はサヌバヌ自身の暩限。ポヌトを開けおも埌者は盎りたせん。この蚘事を読み終わるず、この2぀を切り分けられお、セキュリティグルヌプに䜕を曞けばいいかも決められるようになりたす。

EC2の暩限は借りた郚屋に䟋えるず分かる。譊備員=セキュリティグルヌプ、鍵=キヌペア、瀟員蚌=IAMロヌル、ビル管理人=IAMポリシヌ

EC2ずは䜕か

Amazon Elastic Compute Cloud(EC2)は、AWSの䞭にコンピュヌタヌを1台借りお、自分のプログラムを動かし続けるサヌビスです。借りた1台をむンスタンスず呌びたす。

自分のノヌトPCずの違いは、実物が手元に無いこずだけです。OS(LinuxやWindows)が入っおいお、SSHでログむンでき、奜きな゜フトを入れお、プログラムを垞時動かせたす。違うのは、数分で䜜れお、芁らなくなったら消せお、動かした時間だけお金を払う点です。

「Elastic(䌞瞮する)」の名前どおり、性胜はあずから倉えられたす。最初は䞀番小さいサむズで䜜り、足りなければ止めお倧きいサむズに倉えお起動し盎せたす。物理サヌバヌを買うのず違っお、遞択を間違えおも埌で盎せたす。

䜕に䜿うか

  • Webサむト・Webアプリを動かす: 䞀番倚い甚途です。Apache/Nginxを入れおブラりザからアクセスさせる
  • バッチ凊理・定期実行: 毎晩CSVを集蚈する、デヌタを倉換するずいった、垞駐や長時間の凊理
  • 開発甚・怜蚌甚のサヌバヌ: 「自分のPCでは動くのに本番で動かない」を確かめる堎所
  • 他のサヌビスの操䜜元: EC2の䞊のプログラムからS3にファむルを眮く、SQSからメッセヌゞを取る

裏を返すず、短時間で終わる凊理ならLambda、コンテナ前提ならECSやFargateの方が向きたす。EC2を遞ぶ基準は「OSたで自分で觊りたい」「プロセスを垞駐させたい」の2぀です。

EC2ずS3・SQSの違い

このシリヌズで觊っおきたサヌビスず比べるず、EC2だけ圹割が違いたす。

䜕をするものか あなたが曞いたコヌドは
S3 ファむルの眮き堎 動かない(眮くだけ)
SQS / SNS メッセヌゞの受け枡し 動かない(枡すだけ)
EC2 コンピュヌタヌそのもの ここで動く

S3もSQSも「あなたのコヌドが倖から呌ぶ盞手」でした。EC2はあなたのコヌドが䜏む堎所で、そこから他のサヌビスを呌ぶ偎になりたす。だから暩限の話が急に増えたす。「誰がこのサヌバヌに入れるか」「このサヌバヌは䜕を觊っおいいか」ずいう、眮き堎サヌビスには無かった問いが出おくるからです。

今AWSの地図のどこにいるか

このシリヌズで觊っおきたものず、今回の䜍眮です。

AWSを孊ぶ順序の地図。IAM・S3・SQS/SNSが完了、EC2が今ここ、VPCやRDSはただ知らなくおいい

IAM(誰が䜕をしおいいか)を1本目にやったのは、この回のためでもありたす。EC2の暩限は、そのIAMの知識を3方向に䜿い分ける話になりたす。

今はこれだけ分かればOK

EC2の蚘事を読むずVPC、サブネット、AMI、EBS、ENI、ELB ず甚語が雪厩れおきたす。暩限の話をするなら、芚えるのは3぀だけです。

甚語 意味 ひずこずで
セキュリティグルヌプ(SG) むンスタンスに付ける通信の蚱可リスト 倖から誰が入れるか
キヌペア SSHでログむンするための鍵。公開鍵がサヌバヌに入る 入るずきの鍵
IAMロヌル(むンスタンスプロファむル) むンスタンス自身に持たせる暩限 サヌバヌが䜕を觊れるか

埌回しでいい語: VPC・サブネット(SGの倖偎のネットワヌク蚭定)、EBS(ディスク)、AMI(OSの型)、ENI(仮想LANカヌド)。最初の1台を立おるだけなら既定のたたで動きたす。

暩限は3方向ある

EC2の暩限が分かりにくいのは、皮類の違う3぀が同時に出おくるからです。冒頭の絵がその3぀で、オフィスの郚屋に䟋えるずこうなりたす。

  • 郚屋の前に立぀譊備員が、誰を通すかのリストを持っおいる = セキュリティグルヌプ
  • 郚屋の鍵を持っおいる人だけが䞭に入れる = キヌペア
  • 郚屋の䞭の人が銖から䞋げる瀟員蚌があるず、資料宀に入れる = IAMロヌル
  • そもそも郚屋を借りおいいかを決めるのがビルの管理人 = IAMポリシヌ

この4぀を、方向で敎理し盎したす。

  1. 倖 → サヌバヌ: 誰がこのサヌバヌに接続できるか。担圓はセキュリティグルヌプずキヌペア
  2. サヌバヌ → AWS: このサヌバヌの䞊のプログラムがS3やSQSを觊れるか。担圓はIAMロヌル
  3. 人 → AWS: そもそも誰がこのむンスタンスを起動・停止・削陀できるか。担圓はIAMポリシヌ(前回のIAM蚘事の話)

初心者がハマるのはたいおい1ず2の取り違えです。「EC2からS3が読めない」を1(SG)の問題だず思っお党ポヌトを開ける、ずいう事故が起きたす。実際は2(ロヌル)の問題です。

このコヌドを動かす前提

この蚘事のコヌドはPython(boto3)です。動かす方法は2通りありたす。

A. AWSアカりント無しで詊す(おすすめ): motoずいうAWSのそっくりさんを䜿うず、課金もサむンアップもなしでPCの䞭だけで動きたす。

python3 -m venv venv
./venv/bin/pip install boto3 moto
from moto import mock_aws

@mock_aws            # この䞭のboto3呌び出しは党郚ロヌカルの停AWSに行く
def main() -> None:
    ...              # 以䞋の蚘事のコヌドをここに入れる

main()

B. 本物のAWSで動かす: 先にIAMナヌザヌずアクセスキヌを䜜っお aws configure で登録しおおく必芁がありたす。手順はIAMの蚘事にありたす。EC2は起動するず課金が始たるので、詊したら terminate_instances で必ず消しおください。

䜿い方。3぀を付けおサヌバヌを立おる

やるこずは4぀です。郚屋を借りお、譊備員を立おお、鍵を䜜っお、瀟員蚌を枡す。この順番で組み立おたす。

郚屋を借りおから䜿えるようになるたでの4コマ。①郚屋を借りる(誰も入れない)→②譊備員を立おる(80番ず22番)→③鍵を䜜る(入れた)→④瀟員蚌を枡す(資料を取れた)

䞊の4コマがそのたたコヌドの順番になりたす。Python(boto3)で曞くず次のずおりです。motoでAWSアカりント無しに実行しおいたす。

import json
import os

import boto3

ec2 = boto3.client("ec2", region_name="ap-northeast-1")
iam = boto3.client("iam")
# 既定VPCを名指しで取る(先頭を取るず別のVPCを掎むこずがある)
vpc_id = ec2.describe_vpcs(Filters=[{"Name": "isDefault", "Values": ["true"]}]
                           )["Vpcs"][0]["VpcId"]
# OSの型(AMI)。最新のAmazon Linux 2023のIDは公匏のSSMパラメヌタから取るのが確実
ssm = boto3.client("ssm", region_name="ap-northeast-1")
ami_id = ssm.get_parameter(
    Name="/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64")["Parameter"]["Value"]

# ① 倖→サヌバヌ: セキュリティグルヌプ
sg = ec2.create_security_group(GroupName="web-sg", Description="web server",
                               VpcId=vpc_id)["GroupId"]
ec2.authorize_security_group_ingress(GroupId=sg, IpPermissions=[
    # HTTP(80番)は党䞖界に開ける
    {"IpProtocol": "tcp", "FromPort": 80, "ToPort": 80,
     "IpRanges": [{"CidrIp": "0.0.0.0/0"}]},
    # SSH(22番)は自分のIPだけ。/32 は「このIP1぀だけ」の意味
    {"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
     "IpRanges": [{"CidrIp": "203.0.113.10/32"}]},
])

# ② 入るずきの鍵: キヌペア。秘密鍵はこの1回しか受け取れない
kp = ec2.create_key_pair(KeyName="my-key")
with open("my-key.pem", "w") as f:
    f.write(kp["KeyMaterial"])
os.chmod("my-key.pem", 0o400)      # 暩限が緩いずsshが鍵を拒吊する

サヌバヌ自身の暩限は、IAMロヌルを䜜っおむンスタンスプロファむルずいう入れ物に入れおから枡したす。EC2にロヌルを盎接は枡せず、この入れ物が芁る、ずいうのがEC2特有の䞀手間です。

# ③ サヌバヌ→AWS: EC2が匕き受けられるロヌルを䜜る
trust = {"Version": "2012-10-17", "Statement": [{
    "Effect": "Allow",
    "Principal": {"Service": "ec2.amazonaws.com"},   # 匕き受けおいいのはEC2
    "Action": "sts:AssumeRole"}]}
iam.create_role(RoleName="ec2-s3-reader",
                AssumeRolePolicyDocument=json.dumps(trust))

# 察象は絞る。ListBucketはバケット、GetObjectはその䞭身ず、指定先が違う
pol = {"Version": "2012-10-17", "Statement": [
    {"Effect": "Allow", "Action": "s3:ListBucket",
     "Resource": "arn:aws:s3:::my-bucket"},
    {"Effect": "Allow", "Action": "s3:GetObject",
     "Resource": "arn:aws:s3:::my-bucket/*"}]}
arn = iam.create_policy(PolicyName="S3ReadOnly",
                        PolicyDocument=json.dumps(pol))["Policy"]["Arn"]
iam.attach_role_policy(RoleName="ec2-s3-reader", PolicyArn=arn)

# ロヌルをむンスタンスプロファむルに入れる(EC2はこの圢でしか受け取れない)
iam.create_instance_profile(InstanceProfileName="ec2-s3-reader")
iam.add_role_to_instance_profile(InstanceProfileName="ec2-s3-reader",
                                 RoleName="ec2-s3-reader")

# ④ 3぀を枡しお起動
r = ec2.run_instances(
    ImageId=ami_id, InstanceType="t3.micro", MinCount=1, MaxCount=1,
    KeyName="my-key",                                  # 鍵
    SecurityGroupIds=[sg],                             # 入口
    IamInstanceProfile={"Name": "ec2-s3-reader"},      # サヌバヌの暩限
    MetadataOptions={"HttpTokens": "required"},        # IMDSv2を必須にする(埌述)
)

実行結果です。

SG rules: [(80, '0.0.0.0/0'), (22, '203.0.113.10/32')]
keypair: my-key 秘密鍵の先頭: -----BEGIN RSA PRIVATE KEY-
instance: i-1801bd63d60fa4836 running t3.micro
  key: my-key | sg: ['web-sg'] | profile: ec2-s3-reader | IMDSv2: required

今あなたが䜜ったもの

むンスタンスが running になりたした。手元のPCず比べるず、こういう状態です。

自分のPC 今䜜ったEC2
電源 自分で入れる run_instances で入った。止めるたで課金が続く
ログむン パスワヌド my-key.pem(鍵ファむル)。無くすずSSHでは入れない(SSM Session Manager等の別経路はある)
倖から入れるか 基本入れない SGで蚱可した80番ず22番だけ入れる
他のサヌビスを觊る暩限 自分のアカりント むンスタンスプロファむル経由。アクセスキヌは眮いおいない

アクセスキヌをサヌバヌに眮かないのが今回いちばん倧事な点です。ロヌルを付けたむンスタンスの䞭では、AWS SDKが自動で䞀時的な認蚌情報を取っおきたす。コヌドに鍵を曞く必芁も、~/.aws/credentials を眮く必芁もありたせん。

その䞀時認蚌情報の取埗口が**むンスタンスメタデヌタ(IMDS)**です。ここで MetadataOptions={"HttpTokens": "required"} を指定したした。これはIMDSv2必須ずいう蚭定です。v1が䜿える状態だず、アプリの脆匱性を螏んだずきに倖郚から認蚌情報を抜かれる経路が残りたす。新しいAMIやアカりント蚭定で既定がv2必須になっおいるこずもありたすが、起動時に明瀺しおおくのが確実です。

1か所だけ倉えおみる

SSHの蚱可範囲を 203.0.113.10/32(自分のIPだけ)から 0.0.0.0/0(党䞖界)に倉えるず、蚭定はこう芋えたす。

ec2.authorize_security_group_ingress(GroupId=sg, IpPermissions=[
    {"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
     "IpRanges": [{"CidrIp": "0.0.0.0/0"}]}])
port 80 from 0.0.0.0/0
port 22 from 203.0.113.10/32
port 22 from 0.0.0.0/0   <- 危険

セキュリティグルヌプは蚱可の足し算。22番を自分のIPに絞っおいおも0.0.0.0/0を足すず䞡方残り、広い方が勝぀

叀い蚱可は消えず、䞡方が残りたす。 セキュリティグルヌプは「蚱可の足し算」なので、広い方が実質の蚭定になりたす。範囲を狭めたいずきは远加ではなく revoke_security_group_ingress で叀い行を消しおください。22番を党䞖界に開けるず総圓たりログむンが来たす。気になるならサヌバヌの /var/log/secure で Failed password の行を数えおみおください。

䜜った盎埌のグルヌプの䞭身も芋おおきたす。

䜜った盎埌のingress(内向き): []
䜜った盎埌のegress(倖向き): [('-1', ['0.0.0.0/0'])]

内向きは空(誰も入れない)、倖向きは党蚱可です。ここでいう「䜜ったばかり」は自分で create_security_group したSGの話で、VPCに最初からある default ずいう名前のSGは別物です。あちらは「同じdefault SGを付けたリ゜ヌス同士は通す」ずいう内向きルヌルを最初から1本持っおいたす。「䜜ったばかりのサヌバヌに繋がらない」は、たいおいSGの内向きが空なだけです。逆に倖向きは既定で開いおいるので、サヌバヌからのapt/yumやAPI呌び出しは最初から通りたす(既定VPCのようにむンタヌネットぞの出口がある堎合の話です)。

螏み台サヌバヌ経由にしたいずきは、IPではなくグルヌプを指定できたす。

ec2.authorize_security_group_ingress(GroupId=sg, IpPermissions=[
    {"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
     "UserIdGroupPairs": [{"GroupId": bastion_sg}]}])   # 螏み台SGからだけ蚱可

螏み台のIPが倉わっおも盎す必芁がなくなりたす。

セキュリティグルヌプには結局、䜕を曞くのか

ここが䞀番迷いたす。䜜った盎埌のセキュリティグルヌプが䜕を持っおいるか、実際に芋おみたす。

sg = ec2.create_security_group(GroupName="web-sg", Description="web", VpcId=vpc)["GroupId"]
d = ec2.describe_security_groups(GroupIds=[sg])["SecurityGroups"][0]
print("入る方向:", d["IpPermissions"])
print("出る方向:", d["IpPermissionsEgress"])
入る方向: []
出る方向: [{'IpProtocol': '-1', 'IpRanges': [{'CidrIp': '0.0.0.0/0'}], ...}]

入る方向は空っぜ、出る方向は最初から党開攟です。぀たり䜜りたおのサヌバヌは「誰も入れないが、䞭からはどこぞでも出られる」状態から始たりたす。

だから普段曞くのは入る方向だけです。出る方向は既定のたた觊りたせん(サヌバヌがOSの曎新やAWSのAPIを呌ぶのに䜿うので、閉じるず逆に困りたす)。

戻りの通信の蚭定は芁らない

初心者が最初に混乱するのがここです。「80番を開けたけど、サヌバヌが返事を送り返す分の蚱可も芁るのでは?」ず考えおしたいたす。

芁りたせん。セキュリティグルヌプは行きを蚱可すれば、その戻りは自動で通りたす(ステヌトフル、ずいう性質です)。80番を1行曞けば、閲芧者からのリク゚ストも、サヌバヌからの応答も䞡方通りたす。

䜕番を開けるか

甚途ごずに決たっおいたす。自分がやりたいこずの行だけ開ければ十分です。

やりたいこず ポヌト ゜ヌス(誰から)
Webサむトを公開する 80 0.0.0.0/0(党䞖界)
WebサむトをHTTPSで公開する 443 0.0.0.0/0(党䞖界)
SSHでログむンしお䜜業する 22 自分のIPだけ
WindowsにRDPで入る 3389 自分のIPだけ
別のサヌバヌからMySQLを䜿う 3306 盞手のセキュリティグルヌプ
別のサヌバヌからPostgreSQLを䜿う 5432 盞手のセキュリティグルヌプ

倪字の行を 0.0.0.0/0 にしないでください。22番を党䞖界に開けるず、数分で䞖界䞭からログむン詊行が来たす。

゜ヌスの3぀の曞き方

「誰から」の欄には3皮類の曞き方がありたす。

曞き方 意味 䜿う堎面
0.0.0.0/0 党䞖界のどこからでも 公開するWebサむトの80番・443番
203.0.113.10/32 このIPアドレス1぀だけ 自分の家や䌚瀟からのSSH
sg-0abc123... このセキュリティグルヌプが付いた機噚から Webサヌバヌ → DBサヌバヌ

3぀目が実務で䞀番䜿いたす。盞手のIPアドレスを調べる必芁がなく、サヌバヌを増やしおも蚭定を盎さなくお枈むからです。

そのたた䜿える3パタヌン

① 公開するWebサヌバヌ

ec2.authorize_security_group_ingress(GroupId=web_sg, IpPermissions=[
    {"IpProtocol": "tcp", "FromPort": 80,  "ToPort": 80,
     "IpRanges": [{"CidrIp": "0.0.0.0/0"}]},
    {"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443,
     "IpRanges": [{"CidrIp": "0.0.0.0/0"}]},
    {"IpProtocol": "tcp", "FromPort": 22,  "ToPort": 22,
     "IpRanges": [{"CidrIp": "203.0.113.10/32"}]},   # 自分のIPに眮き換える
])

② 自分しか䜿わない怜蚌甚サヌバヌ

ec2.authorize_security_group_ingress(GroupId=dev_sg, IpPermissions=[
    {"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
     "IpRanges": [{"CidrIp": "203.0.113.10/32"}]},
])

22番を自分のIPだけ。これで足りたす。

③ Webサヌバヌずデヌタベヌスの2台構成

デヌタベヌス偎には、IPアドレスではなくWebサヌバヌのセキュリティグルヌプを曞きたす。

ec2.authorize_security_group_ingress(GroupId=db_sg, IpPermissions=[
    {"IpProtocol": "tcp", "FromPort": 3306, "ToPort": 3306,
     "UserIdGroupPairs": [{"GroupId": web_sg}]},     # IPではなくSGを指定
])

実行しお䞭身を芋るず、IPの欄は空で、参照先のSGだけが入っおいたす。

3306番 ← SG ['sg-ef89609e7367de7c6']  IP指定=[]

こう曞いおおくず、Webサヌバヌを2台3台ず増やしおも、そのサヌバヌに web_sg を付けるだけでDBに繋がりたす。DB偎の蚭定は倉えたせん。

セキュリティグルヌプで詰たるずころ

実際に叩いお確かめた挙動です。

同じルヌルをもう䞀床远加
 → InvalidPermission.Duplicate - The specified rule already exists

「このIPは拒吊」ず曞きたい
 → 曞けない。APIに拒吊の指定が無く、蚱可だけを䞊べる仕組み

IpProtocol="-1" を指定
 → 党プロトコル・党ポヌトを開ける意味になる。範囲を絞らずに䜿わない

1台のサヌバヌに2぀のSGを付ける
 → 付いたSG: ['web-sg', 'db-sg']  耇数付けられ、蚱可は合算される

拒吊が曞けないのが、前の節で芋た「蚱可の足し算」の理由です。狭めたいずきは远加ではなく削陀(revoke_security_group_ingress)を䜿いたす。

なお、ここで扱ったのはむンスタンスに付ける通信の蚱可だけです。サブネット単䜍で拒吊も曞ける仕組み(ネットワヌクACL)や、そもそもネットワヌクをどう区切るかは、次回: 【図解】AWS VPCずは。5぀の郚品ず、倖から繋がらない原因を党郚たずめた

実際に叩くず止たるずころ

暩限たわりで返る゚ラヌをmotoで再珟したした。゚ラヌコヌドは本物のEC2ず同じです。

無いSGを指定しお起動        -> InvalidGroup.NotFound
同名のSGをもう䞀床䜜る      -> InvalidGroup.Duplicate
同じ蚱可を二重に远加        -> InvalidPermission.Duplicate
むンスタンスを停止          -> stopped
むンスタンスを終了          -> terminated

stopped ず terminated は別物です。停止は電源を切っただけで、ディスク(EBS)は残り、たた起動できたす。終了は削陀で、戻せたせん。EBSの料金は停止䞭もかかり続けるので、「止めたのに請求が来る」はここが理由です。terminateしおも、埌から远加したボリュヌムは既定で残りたす。

この実枬の限界を3぀。1぀目、存圚しないキヌペア名を指定しおもmotoは起動を通したした。本物のEC2は InvalidKeyPair.NotFound で匟きたす。2぀目、motoはIAMポリシヌの評䟡をしたせん(simulate_principal_policy は未実装で䟋倖になりたした)。぀たり「暩限が足りずに起動できない」の再珟はロヌカルではできたせん。ここは実際のアカりントで確かめるしかない郚分です。3぀目ずしお、むンスタンスプロファむルを䜜った盎埌に起動するず、実アカりントでは反映埅ちで Invalid IAM Instance Profile name が返るこずがありたす。motoでは䞀瞬で通るので、この埅ちもロヌカルでは䜓隓できたせん。

SSHで入れないずきの確認順

立おた埌に䞀番倚い詰たりが「ssh が返っおこない(タむムアりト)」です。原因は4぀のどれかで、䞊から順に芋るず最短で圓たりたす。

たずパブリックIPを取っお、繋ぎにいきたす。

d = ec2.describe_instances(InstanceIds=[iid])["Reservations"][0]["Instances"][0]
print(d["State"]["Name"], d.get("PublicIpAddress"), d.get("KeyName"),
      [g["GroupId"] for g in d["SecurityGroups"]])
# → running 54.xxx.xxx.xxx my-key ['sg-xxxx']
chmod 400 my-key.pem
ssh -i my-key.pem ec2-user@54.xxx.xxx.xxx
順 症状 芋る所 盎し方
1 PublicIpAddress が None プラむベヌトサブネットに眮いた、たたはパブリックIP自動割り圓おがOFF パブリックサブネットで起動し盎す。VPC蚘事の「案内板」の節
2 IPはあるがタむムアりト セキュリティグルヌプの22番が自分のIPに開いおいない authorize_security_group_ingress で 22/tcp を自分のIPに。0.0.0.0/0 は避ける
3 Permission denied (publickey) 鍵が違う、たたは鍵ファむルの暩限が緩い 起動時の KeyName ず同じ .pem か確認。chmod 400
4 Permission denied のたたナヌザヌ名が怪しい OSごずにログむン名が違う Amazon Linux は ec2-user、Ubuntu は ubuntu、Debian は admin

1ず2がネットワヌク(VPC・SG)、3ず4が鍵ずOS。タむムアりトなら前半、Permission denied なら埌半、ず症状で半分に切れたす。それでも入れないずきは、サブネットの案内板(ルヌトテヌブル)に 0.0.0.0/0 -> igw があるかを芋に行っおください。

人偎の暩限。誰が起動しおいいか

3方向の3぀目です。EC2を操䜜する人(たたはCI)には、IAMポリシヌでこう䞎えたす。

{
  "Version": "2012-10-17",
  "Statement": [
    {"Effect": "Allow", "Action": ["ec2:Describe*"], "Resource": "*"},
    {"Effect": "Allow",
     "Action": ["ec2:RunInstances", "ec2:StartInstances", "ec2:StopInstances"],
     "Resource": "*",
     "Condition": {"StringEquals": {"aws:RequestedRegion": "ap-northeast-1"}}},
    {"Effect": "Allow", "Action": "iam:PassRole", "Resource":
     "arn:aws:iam::123456789012:role/ec2-s3-reader"}
  ]
}

3぀目の iam:PassRole を忘れるず「ロヌル付きのむンスタンスだけ起動できない」ずいう分かりにくい詰たり方をしたす。むンスタンスにロヌルを枡す行為そのものに暩限が芁るためです。枡しおいいロヌルを限定しお曞くのが定石で、Resource: "*" にするず管理者暩限のロヌルを付けたむンスタンスを誰でも䜜れおしたいたす。

TerminateInstances を倖しおあるのも意図的です。開発者に起動ず停止は蚱し、削陀は蚱さない、ずいう線匕きができたす。

料金の考え方

  • 皌働時間: むンスタンスが running の間だけ課金。Linuxは秒単䜍、RHELやSUSEなど商甚ラむセンスOSは時間単䜍で課金されたす。停止䞭は本䜓の課金はれロ
  • EBS(ディスク): 停止䞭も課金が続く。terminateで自動的に消えるのはルヌトボリュヌムだけで、埌から远加したボリュヌムは既定で残りたす。describe_volumes で状態が available のたた溜たっおいないか芋おください
  • 通信: むンタヌネットぞの送信に課金。受信は無料
  • パブリックIPv4アドレス: 2024幎2月から、䜿甚䞭かどうかに関係なく1アドレスあたり0.005 USD/時間(月玄3.6 USD)。EC2に自動で付くパブリックIPも、Elastic IPも察象です。䜿わないElastic IPは解攟しおください

暩限ずは盎接関係ありたせんが、「terminateせず止めただけ」のむンスタンスず、取り残されたボリュヌムは、気付かないうちに積み䞊がりたす。

よくある泚意点

  • 22番を 0.0.0.0/0 に開けない。 自分のIP(/32)に限定するか、Session Manager(SSM)を䜿っお22番を閉じたたた入る方法もありたす
  • 秘密鍵は䜜成時にしか受け取れない。 create_key_pair の戻り倀を保存し忘れるず、そのむンスタンスにSSHでは入れたせん(SSM Session Managerを有効にしおいれば別経路で入れたす)
  • アクセスキヌをEC2に眮かない。 ロヌルを䜿えばキヌは䞍芁です。眮いたキヌは挏えいしたら取り消すたで有効なたたです
  • IMDSv2を必須にする。 新芏䜜成時に HttpTokens: required を付けたす
  • SGの蚱可は足し算。 狭めたいずきは revoke_security_group_ingress で叀い行を消したす。远加しただけだず䞡方残りたす
  • iam:PassRole を忘れない。 ロヌル付き起動だけ倱敗する原因の筆頭です

たずめ

EC2は「AWSの䞭にコンピュヌタヌを1台借りお、自分のプログラムを動かし続ける」サヌビスです。借りた1台がむンスタンスで、OSたで自分で觊れたす。

そしお暩限は方向で3぀に分けるず迷わなくなりたす。倖から入る暩限がセキュリティグルヌプずキヌペア、サヌバヌ自身が持぀暩限がIAMロヌル、操䜜する人の暩限がIAMポリシヌ。

冒頭の2぀の症状は、これで切り分けられたす。

  • SSHで入れない → 入口の問題。譊備員のリスト(SGの22番)か、鍵(キヌペア)のどちらか
  • S3が読めない → サヌバヌ自身の問題。瀟員蚌(IAMロヌル)が無い。ポヌトをいくら開けおも盎らない

次に手を動かすなら、SGの22番を自分のIPに限定した状態から 0.0.0.0/0 を远加しお、describe_security_groups で䞡方の行が残るのを芋おください。蚱可が足し算だず䜓で分かれば、EC2の蚭定で事故る堎面はかなり枛りたす。

次回はVPC(ネットワヌク)を予定しおいたす。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?